Class类中的getEnclosingXX、getDeclaredXX

转载自  Class类中的getEnclosingXX、getDeclaredXX

一、getEnclosingXX

getEnclosingClass():该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类

getEnclosingConstructor():该类是在哪个构造函数中定义的,比如构造方法中定义的匿名内部类

getEnclosingMethod():该类是在哪个方法中定义的,比如方法中定义的匿名内部类

实例

package reflect;  
  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Method;  
  
/** 
 * @author zhangquanit 
 */  
public class Outer {  
  
    public Outer() {  
        // 构造方法中的匿名内部类  
        InnerClass innerClass = new InnerClass() {  
            @Override  
            public void fun() {  
                getEnclosing(this.getClass());  
                /** 
                 * enclosingClass=class reflect.Outer 
                 * enclosingConstructor=public reflect.Outer() 
                 * enclosingMethod=null 
                 */  
            }  
        };  
        innerClass.fun();  
    }  
  
    // 匿名内部类  
    static InnerClass innerClass = new InnerClass() {  
        public void fun() {  
            getEnclosing(this.getClass());  
            /** 
             * enclosingClass=class reflect.Outer  
             * enclosingConstructor=null 
             * enclosingMethod=null 
             */  
        };  
    };  
  
    public static void test() {  
        // 方法中的匿名内部类  
        InnerClass innerClass = new InnerClass() {  
            @Override  
            public void fun() {  
                getEnclosing(this.getClass());  
                /** 
                 * enclosingClass=class reflect.Outer  
                 * enclosingConstructor=null 
                 * enclosingMethod=public static void reflect.Outer.test() 
                 */  
  
            }  
        };  
        innerClass.fun();  
    }  
  
    // 内部类  
    public static class InnerClass {  
        public InnerClass() {  
  
        }  
  
        public void fun() {  
  
        }  
    }  
  
    public static void main(String[] args) {  
        System.out.println("------内部类------");  
        getEnclosing(InnerClass.class);  
          
        System.out.println("------匿名内部类------");  
        innerClass.fun();  
          
        System.out.println("------方法中的匿名内部类------");  
        Outer.test();  
          
        System.out.println("------构造函数中的匿名内部类------");  
        new Outer();  
      
    }  
  
    /** 
     * getEnclosingClass:该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类 
     * getEnclosingConstructor:该类是在哪个构造函数中定义的,比如构造方法中定义的匿名内部类 
     * getEnclosingMethod:该类是在哪个方法中定义的,比如方法中定义的匿名内部类 
     *  
     * @param cls 
     */  
    private static void getEnclosing(Class cls) {  
        Class enclosingClass = cls.getEnclosingClass();  
        Constructor enclosingConstructor = cls.getEnclosingConstructor();  
        Method enclosingMethod = cls.getEnclosingMethod();  
        System.out.println("enclosingClass=" + enclosingClass);  
        System.out.println("enclosingConstructor=" + enclosingConstructor);  
        System.out.println("enclosingMethod=" + enclosingMethod);  
  
    }  
  
    private static void getDecalared() {  
  
    }  
  
}  

二、getDeclaringClass

getDeclaringClass :获取当前类定义所在的类.

package reflect;  
import java.util.Arrays;  
  
/** 
 * @author zhangquanit 
 */  
public class Outer {  
  
    // 内部类  
    public static class InnerClass {  
        public InnerClass() {  
  
        }  
  
        public void fun() {  
  
        }  
    }  
  
    // 内部接口  
    public interface InnerInterface {  
  
    }  
      
 public static void main(String[] args) {  
  
    Class<?> declaringClass = InnerClass.class.getDeclaringClass();  
    System.out.println("InnerClass定义所在类为:"+declaringClass);//class reflect.Outer  
      
    declaringClass =InnerInterface.class.getDeclaringClass();  
    System.out.println("InnerInterface定义所在类为:"+declaringClass);//class reflect.Outer  
 }   
  
}  

三、getDeclaredXX

获取当前类中的成员。比如当前类中定义的内部类、构造函数、成员变量、方法。

// 1.获取当前类中的所有类、接口、枚举、注解类等。 (不包括继承的)  
Class<?>[] declaredClasses = Outer.class.getDeclaredClasses();  
System.out.println(Arrays.toString(declaredClasses));  
// 打印 [class reflect.Outer$InnerClass, interface reflect.Outer$InnerInterface]  
  
// 2.当前类上直接使用的注解 (不包括继承的)  
Annotation[] declaredAnnotations = Outer.class.getDeclaredAnnotations();  
System.out.println(Arrays.toString(declaredAnnotations));  
// 打印 [@reflect.MyAnnotation(intValue=0)]  
  
// 3.当前类中的所有构造函数 (不包括继承的)  
Constructor<?>[] declaredConstructors = Outer.class.getDeclaredConstructors();  
System.out.println(Arrays.toString(declaredConstructors));  
// 打印 [public reflect.Outer(int), public reflect.Outer()]  
  
// 4.当前类中的所有成员变量 (不包括继承的)  
Field[] declaredFields = Outer.class.getDeclaredFields();  
//      Outer.class.getDeclaredField(name)  
System.out.println(Arrays.toString(declaredFields));  
  
// 5.当前类中的所有方法 (不包括继承的)  
Method[] declaredMethods = Outer.class.getDeclaredMethods();  
//      Outer.class.getDeclaredMethod(name, parameterTypes)  
System.out.println(Arrays.toString(declaredMethods)); 


猜你喜欢

转载自blog.csdn.net/moakun/article/details/80577227