java 反射示例(内部类操作)
****************
相关类及接口
Class
public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement,
TypeDescriptor.OfField<Class<?>>,
Constable {
*****************
getEnclosing**()
Class<?> getEnclosingClass() { return enclosingClass; }
//类B在类A中(字段级别)、构造方法、普通方法中定义
//B.class.getEnclosingClass()可获取类对象A.class
public Constructor<?> getEnclosingConstructor() throws SecurityException {
//类B在类A的构造方法中定义
//B.class.getEnclosingConstructor()可获得类对象A.class
public Method getEnclosingMethod() throws SecurityException {
//类B在类A的普通方法中定义
//B.class.getEnclosingMethod()可获得类对象A.class
*****************
getDeclaringClass()
public Class<?> getDeclaringClass() throws SecurityException {
//类B是类A的内部类(字段级别),B.class.getDeclaringClass()获得类对象A.class
//类B在类A的构造方法、普通方法中定义,B.class.getDeclaringClass()为null
//类B不是内部类,B.class.getDeclaringClass()为null
*****************
getDeclaredClasses()
public Class<?>[] getDeclaredClasses() throws SecurityException {
//获取类中声明的所有内部类
//类B是类A的内部类,A.class.getDeclaredClasses()可获得类对象B.class
****************
示例
package reflection;
import java.util.Arrays;
interface A{
void fun();
}
class B{
public static void printClass(Class<?> c){
System.out.println("c.getTypeName() ==> "+c.getTypeName());
System.out.println("c.getSimpleName() ==> "+c.getSimpleName());
System.out.println("c.getDeclaringClass() ==> "+c.getDeclaringClass());
System.out.println("c.getDeclaredClasses() ==> "+Arrays.toString(c.getDeclaredClasses()));
System.out.println("c.getEnclosingClass() ==> "+c.getEnclosingClass());
System.out.println("c.getEnclosingConstructor() ==> "+c.getEnclosingConstructor());
System.out.println("c.getEnclosingMethod() ==> "+c.getEnclosingMethod()+"\n");
}
}
class Outer{
class Inner{
}
public Outer(){
class Inner2{
}
Class<?> c2=Inner2.class;
System.out.println("Outer ==> public Outer() ==> Inner2.class:");
B.printClass(c2);
}
public void fun(){
class Inner3{
}
Class<?> c3=Inner3.class;
System.out.println("Outer ==> public void fun() ==> Inner3.class:");
B.printClass(c3);
}
public void fun2(){
((A) () -> {
class Inner4{
}
Class<?> c4=Inner4.class;
System.out.println("Outer ==> public void fun2() ==> new A(){ fun(){} } ==> Inner4.class:");
B.printClass(c4);
}).fun();
}
}
public class MyTest {
public static void main(String[] args){
Class<?> o=Outer.class;
System.out.println("Outer.class:");
B.printClass(o);
Class<?> c= Outer.Inner.class;
System.out.println("Outer.Inner.class:");
B.printClass(c);
Outer outer=new Outer();
outer.fun();
outer.fun2();
}
}
**************
控制台输出
Outer.class:
c.getTypeName() ==> reflection.Outer
c.getSimpleName() ==> Outer
c.getDeclaringClass() ==> null
c.getDeclaredClasses() ==> [class reflection.Outer$Inner]
c.getEnclosingClass() ==> null
c.getEnclosingConstructor() ==> null
c.getEnclosingMethod() ==> null
Outer.Inner.class:
c.getTypeName() ==> reflection.Outer$Inner
c.getSimpleName() ==> Inner
c.getDeclaringClass() ==> class reflection.Outer
c.getDeclaredClasses() ==> []
c.getEnclosingClass() ==> class reflection.Outer
c.getEnclosingConstructor() ==> null
c.getEnclosingMethod() ==> null
Outer ==> public Outer() ==> Inner2.class:
c.getTypeName() ==> reflection.Outer$1Inner2
c.getSimpleName() ==> Inner2
c.getDeclaringClass() ==> null
c.getDeclaredClasses() ==> []
c.getEnclosingClass() ==> class reflection.Outer
c.getEnclosingConstructor() ==> public reflection.Outer()
c.getEnclosingMethod() ==> null
Outer ==> public void fun() ==> Inner3.class:
c.getTypeName() ==> reflection.Outer$1Inner3
c.getSimpleName() ==> Inner3
c.getDeclaringClass() ==> null
c.getDeclaredClasses() ==> []
c.getEnclosingClass() ==> class reflection.Outer
c.getEnclosingConstructor() ==> null
c.getEnclosingMethod() ==> public void reflection.Outer.fun()
Outer ==> public void fun2() ==> new A(){ fun(){} } ==> Inner4.class:
c.getTypeName() ==> reflection.Outer$1Inner4
c.getSimpleName() ==> Inner4
c.getDeclaringClass() ==> null
c.getDeclaredClasses() ==> []
c.getEnclosingClass() ==> class reflection.Outer
c.getEnclosingConstructor() ==> null
c.getEnclosingMethod() ==> public void reflection.Outer.fun2()