背景:JDK13、IDEA2019.2.4
一、创建一个外部类
package com.zsx.reflect;
public class OutClass {
private void print() {
System.out.println("Calling the OutClass print method" );
}
class InnerClass {
private void print() {
System.out.println("Calling the InnerClass print method" );
}
}
private class InnerClass1 {
private void print() {
System.out.println("Calling the InnerClass1 print method" );
}
}
private class InnerClass2 {
private void print() {
System.out.println("Calling the InnerClass2 print method" );
}
}
}
二、编写测试案例
package com.zsx.test.reflect;
import com.zsx.reflect.OutClass;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class ReflectTest {
@Test
@DisplayName("Calling methods of inner classes via reflection")
void testReflectInnerClass() {
OutClass entity = new OutClass();
Class<?>[] declaredClasses = OutClass.class.getDeclaredClasses();
Arrays.stream(declaredClasses).forEach(clazz->{
Arrays.stream(clazz.getDeclaredMethods()).forEach(method -> {
try {
method.setAccessible(true);
// 获取内部类的构造方法,内部类的构造只能通过外部类来获取
Constructor declaredConstructor = clazz.getDeclaredConstructor(OutClass.class);
declaredConstructor.setAccessible(true);
// 由外部类对象来反射获取内部类的对象
Object obj = declaredConstructor.newInstance(entity);
method.invoke(obj);
} catch (IllegalAccessException | NoSuchMethodException
| InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
});
});
}
}
三、运行测试方法、查看控制台测试结果
Calling the InnerClass2 print method
Calling the InnerClass1 print method
Calling the InnerClass print method
从以上结果可以看出调用成功