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

Bagaimana untuk mendapatkan kelas dalaman bukan statik melalui refleksi di Jawa

WBOY
Lepaskan: 2023-05-21 10:01:05
ke hadapan
1579 orang telah melayarinya

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("内部类方法...");
        }
    }
}
Salin selepas log masuk

[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);
    }
Salin selepas log masuk

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+"----内部类方法...");
        }
    }
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan