java 反射内部匿名内部类_android-反射的使用(反射静态内部类、非静态内部类、匿名内部类等)...
时间: 2023-12-19 21:17:30 浏览: 150
java 内部类使用(内部匿名类)
5星 · 资源好评率100%
Java反射可以用来访问类的私有属性和方法,以及动态创建对象和调用方法。对于内部类的反射使用,需要使用getDeclaredClasses()方法获取类的内部类信息,返回的是一个数组,可以通过遍历数组获取内部类的信息。
对于静态内部类,可以通过类名直接访问,也可以通过反射获取其Class对象。对于非静态内部类,需要先创建外部类对象,再通过外部类对象创建内部类对象,或者通过反射获取其Class对象。对于匿名内部类,需要通过反射获取其父类或接口的Class对象,再通过newInstance()方法创建对象。
下面是一个示例代码:
```java
public class OuterClass {
private String outerField;
public void outerMethod() {
System.out.println("Outer method");
}
public static class StaticInnerClass {
private String staticInnerField;
public void staticInnerMethod() {
System.out.println("Static inner method");
}
}
public class InnerClass {
private String innerField;
public void innerMethod() {
System.out.println("Inner method");
}
}
public static void main(String[] args) {
// 获取所有内部类信息
Class<?>[] declaredClasses = OuterClass.class.getDeclaredClasses();
for (Class<?> clazz : declaredClasses) {
System.out.println(clazz.getName());
}
try {
// 访问静态内部类的方法
StaticInnerClass staticInner = new StaticInnerClass();
staticInner.staticInnerMethod();
Class<?> staticInnerClass = Class.forName("OuterClass$StaticInnerClass");
Object staticInnerObj = staticInnerClass.newInstance();
Method staticInnerMethod = staticInnerClass.getDeclaredMethod("staticInnerMethod");
staticInnerMethod.invoke(staticInnerObj);
// 访问非静态内部类的方法
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
inner.innerMethod();
Class<?> innerClass = Class.forName("OuterClass$InnerClass");
Constructor<?> innerConstructor = innerClass.getDeclaredConstructor(OuterClass.class);
Object innerObj = innerConstructor.newInstance(outer);
Method innerMethod = innerClass.getDeclaredMethod("innerMethod");
innerMethod.invoke(innerObj);
// 访问匿名内部类的字段和方法
Runnable runnable = new Runnable() {
private String anonymousField;
@Override
public void run() {
System.out.println("Anonymous run");
}
};
Class<?> anonymousClass = runnable.getClass();
Field anonymousField = anonymousClass.getDeclaredField("anonymousField");
anonymousField.setAccessible(true);
anonymousField.set(runnable, "anonymous value");
Method anonymousMethod = anonymousClass.getDeclaredMethod("run");
anonymousMethod.invoke(runnable);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
阅读全文