反射调用类的私有方法与私有内部类的私有方法

package org.example;

import javax.lang.model.element.VariableElement;

public class DT {
    public static void main(String[] args) {

    }

}
class Students{
    private int get1(int year){
        return 123;
    }

    private String get2(String B){
        return "sss";
    }

    private class dt{
        private int get3(int day){
            return day;
        }
    }
}

在Student公共类中定义一个私有的的类dt,里面有私有的方法get3,还有两个私有的方法get1 和 get2

反射调用私有方法get1和get2

由于JVM为每个加载的class创建了对应的Class(大写)实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。

所以第一步先要获取到类的实例Class

Class a = Class.forName("org.example.Students");

第二步通过反射创建实例(可以通过调用Class提供的newInstance()方法)

Object b =a.newInstance();

第三步通过反射获取Students类的私有方法get1

Method c = a.getDeclaredMethod("get1",int.class);

第四步,设置允许私有类的方法可以被访问

c.setAccessible(true);

第五步输出

System.out.println(c.invoke(b,11));

invoke(反射类的实例,随意方法的数据类型值)

反射调用私有类dt中的私有方法get3

第一步、获取内部类dt实例Class

Class d =Class.forName("org.example.Students$dt");

第二步、创建私有类的实例需要先获得类的构造方法

Constructor e = d.getDeclaredConstructors()[0];

第三步、设置允许私有类的的私有类dt可以被访问

e.setAccessible(true);

第四步、通过构造方法去创建实例,注意:创建内部类的实例的前提得先创建一个外部类的实例,这里注意创建外部类的实例是Students,上面第一步的a(Class a = Class.forName("org.example.Students"))

Object f = e.newInstance(a.newInstance());

第五步、通过实例反射内部的私有方法

Method g = f.getClass().getDeclaredMethod("get3",int.class);

第六步、设置允许私有类的方法get3可以被访问

g.setAccessible(true);

第七步、输出

System.out.println(g.invoke(f,11));

反射调用构造方法

getConstructor(Class...):获取某个public的Constructor;
getDeclaredConstructor(Class...):获取某个Constructor;
getConstructors():获取所有public的Constructor;
getDeclaredConstructors():获取所有Constructor。

反射调用方法

Method getMethod(name, Class...):获取某个public的Method(包括父类)
Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类);name为方法名
Method[] getMethods():获取所有public的Method(包括父类)
Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)

完整代码

package org.example;

import javax.lang.model.element.VariableElement;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class DT {
    public static void main(String[] args) throws Exception{
        Class a = Class.forName("org.example.Students");
        Object b =a.newInstance();
        Method c = a.getDeclaredMethod("get1",int.class);
        c.setAccessible(true);
        System.out.println(c.invoke(b,11));

        Class d =Class.forName("org.example.Students$dt");
        //创建私有类的实例需要先获得类的构造方法
        Constructor e = d.getDeclaredConstructors()[0];
        e.setAccessible(true);
        //通过构造方法去创建实例/创建内部类的实例的前提得先创建一个外部类的实例,这里注意创建外部类的实例是a
        Object f = e.newInstance(a.newInstance());
        Method g = f.getClass().getDeclaredMethod("get3",int.class);
        g.setAccessible(true);
        System.out.println(g.invoke(f,11));


    }

}
class Students{
    private int get1(int year){
        return 123;
    }

    private String get2(String B){
        return "sss";
    }

    private class dt{
        private int get3(int day){
            return day;
        }
    }
}






posted @ 2021-10-13 20:08  大头DDTT  阅读(844)  评论(0)    收藏  举报