Rumah  >  Artikel  >  Java  >  Bagaimana untuk mendapatkan kelas dalaman bukan statik melalui refleksi di Jawa

Bagaimana untuk mendapatkan kelas dalaman bukan statik melalui refleksi di Jawa

WBOY
WBOYke hadapan
2023-05-21 10:01:051533semak imbas

1. Pembina tanpa hujah

/**
 *  反射内部类
 * @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);
    }

2. Pembina dengan parameter

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

Bagaimana untuk mendapatkan kelas dalaman bukan statik melalui refleksi di Jawa

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam