Heim  >  Artikel  >  Java  >  So erhalten Sie nicht statische innere Klassen durch Reflektion in Java

So erhalten Sie nicht statische innere Klassen durch Reflektion in Java

WBOY
WBOYnach vorne
2023-05-21 10:01:051495Durchsuche

1. Konstruktor ohne Argumente

/**
 *  反射内部类
 * @author zhangyu
 * @date 2022/1/8
*/
public class OuterClass {

    public void process() {
        System.out.println("外部类方法...");
    }

    class InnerClass {
        public void process() {
            System.out.println("内部类方法...");
        }
    }
}

[1] Um das interne Klassenobjekt zu erhalten, muss man sich auf das Objekt der externen Klasse verlassen.

[2] Um das interne zu erhalten Klasse bis Klasse kann auf zwei Arten sein

  • Der erste: Class.forName("package.name.OuterClass I n n e r C l a s " ) durch InnerClass") durch InnerClass" ) durch Symbolpositionierung Zur inneren Klasse

  • Zweitens: Verwenden Sie OuterClass.class.getDeclaredClasses() über die äußere Klasse Klasse, um die unter der äußeren Klasse verfügbaren Objekte der inneren Klasse zu erhalten

    #🎜 🎜#
[3] Für die Instanziierung einer Klasse ist ein Konstruktor erforderlich, und der Aufruf des Konstruktors durch Reflektion erfordert die Einstellung „accessible“ constructiontor.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. Parametrisierter Konstruktor

Die obige Beschreibung ist ein Konstruktor ohne Parameter, und das Folgende ist eine Beschreibung des Konstruktors mit Parametern

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

So erhalten Sie nicht statische innere Klassen durch Reflektion in Java

Das obige ist der detaillierte Inhalt vonSo erhalten Sie nicht statische innere Klassen durch Reflektion in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen