Home > Java > javaTutorial > How to obtain non-static inner classes through reflection in Java

How to obtain non-static inner classes through reflection in Java

WBOY
Release: 2023-05-21 10:01:05
forward
1583 people have browsed it

1. Parameterless constructor

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

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

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

[1] Obtaining internal class objects requires relying on objects of external classes

[2] There are two ways to obtain internal classes through Class

  • The first type: Class.forName("package.name.OuterClass I n n e r C l a s s " ) through InnerClass") through InnerClass") through symbols to locate the inner class

  • Second: Use OuterClass.class.getDeclaredClasses() through the external class Class to obtain the internal class objects available under the external class

【3】Required for instantiating the class Constructor, the reflective calling constructor needs to set the accessible constructor.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);
    }
Copy after login

2. Constructor with parameters

The above description is the constructor without parameters, the following description Constructor with parameters

/**
 *  反射内部类
 * @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+"----内部类方法...");
        }
    }
}
Copy after login
    @Test
    public  void test5() throws InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException {
        //需要依赖外部类对象实例化内部类
        Class outerClass = Class.forName("reflection.demo.OuterClass");
        Constructor declaredConstructor = outerClass.getDeclaredConstructor(String.class);
        declaredConstructor.setAccessible(true);
        //获取外部类实例以及设置构造函数值
        Object outerObject = declaredConstructor.newInstance("outerClass");

        //如果知道外部类下内部类数量,那么通过下面方式即可
        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,"innerClass");
        Method innerClassDeclaredMethod = innerClass.getDeclaredMethod("process");
        innerClassDeclaredMethod.setAccessible(true);
        innerClassDeclaredMethod.invoke(innerObject);
    }
Copy after login

How to obtain non-static inner classes through reflection in Java

The above is the detailed content of How to obtain non-static inner classes through reflection in Java. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:yisu.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template