转载自 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));