/** * 反射内部类 * @author zhangyu * @date 2022/1/8 */ public class OuterClass { public void process() { System.out.println("外部类方法..."); } class InnerClass { public void process() { System.out.println("内部类方法..."); } } }
[1] Mendapatkan objek kelas dalaman memerlukan bergantung pada objek kelas luaran
[2] Terdapat dua cara untuk mendapatkan kelas dalaman melalui Kelas
Jenis pertama: Class.forName("package.name.OuterClass I n n e r C l a s s " ) melalui InnerClass") melalui InnerClass") melalui simbol untuk mencari kelas dalam
Kedua: Gunakan OuterClass.class.getDeclaredClasses() melalui kelas luaran untuk mendapatkan objek kelas dalaman yang tersedia di bawah kelas luaran
【3】Diperlukan untuk instantiating Pembina kelas, pembina panggilan reflektif perlu menetapkan konstruktor yang boleh diakses.setAccessible(true);
@Test public void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { //需要依赖外部类对象实例化内部类 Class outerClass = Class.forName("reflection.demo.OuterClass"); Object outerObject = outerClass.newInstance(); //如果知道外部类下内部类数量,那么通过下面方式即可 Class<?> innerClass = OuterClass.class.getDeclaredClasses()[0]; //如果知道内部类全限定名,可以通过下面的方式 //Class<?> innerClass = Class.forName("full.package.name.OuterClass$InnerClass") //获取默认构造器 Constructor<?> constructor = innerClass.getDeclaredConstructors()[0]; //也可以通过下面的方式获取构造器 //Constructor<?> constructor = innerClass.getDeclaredConstructor(OuterClass.class); //默认构造器私有的,需要设置可访问 constructor.setAccessible(true); //通过构造器和父类Class创建内部类实例 Object innerObject = constructor.newInstance(outerObject); Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process"); innerClassDeclaredMethod.setAccessible(true); innerClassDeclaredMethod.invoke(innerObject); }
Penerangan di atas ialah pembina tanpa parameter, yang diterangkan di bawah Pembina dengan parameter
/** * 反射内部类 * @author zhangyu * @date 2022/1/8 */ public class OuterClass { private String name; public OuterClass(String name) { this.name = name; } public void process() { System.out.println("外部类方法..."); } class InnerClass { private String name; public InnerClass(String name) { this.name = name; } public void process() { System.out.println(name+"----内部类方法..."); } } }rrree
Atas ialah kandungan terperinci Bagaimana untuk mendapatkan kelas dalaman bukan statik melalui refleksi di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!