通过反射调用内部类的方法

背景:JDK13、IDEA2019.2.4

一、创建一个外部类

package com.zsx.reflect;

public class OutClass {

    private void print() {
        System.out.println("Calling the OutClass print method" );
    }

    class InnerClass {

        private void print() {
            System.out.println("Calling the InnerClass print method" );
        }
    }

    private class InnerClass1 {

        private void print() {
            System.out.println("Calling the InnerClass1 print method" );
        }
    }

    private class InnerClass2 {

        private void print() {
            System.out.println("Calling the InnerClass2 print method" );
        }
    }

}

二、编写测试案例

package com.zsx.test.reflect;

import com.zsx.reflect.OutClass;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

public class ReflectTest {

    @Test
    @DisplayName("Calling methods of inner classes via reflection")
    void testReflectInnerClass() {
        OutClass entity = new OutClass();
        Class<?>[] declaredClasses = OutClass.class.getDeclaredClasses();
        Arrays.stream(declaredClasses).forEach(clazz->{
            Arrays.stream(clazz.getDeclaredMethods()).forEach(method -> {
                try {
                    method.setAccessible(true);
                    // 获取内部类的构造方法,内部类的构造只能通过外部类来获取
                    Constructor declaredConstructor = clazz.getDeclaredConstructor(OutClass.class);
                    declaredConstructor.setAccessible(true);
                    // 由外部类对象来反射获取内部类的对象
                    Object obj = declaredConstructor.newInstance(entity);
                    method.invoke(obj);
                } catch (IllegalAccessException | NoSuchMethodException
                        | InstantiationException | InvocationTargetException e) {
                    e.printStackTrace();
                }
            });
        });

    }

}

三、运行测试方法、查看控制台测试结果

Calling the InnerClass2 print method
Calling the InnerClass1 print method
Calling the InnerClass print method

从以上结果可以看出调用成功

发布了129 篇原创文章 · 获赞 14 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zsx18273117003/article/details/103399005