一、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));