反射调用类的私有方法与私有内部类的私有方法
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;
}
}
}

浙公网安备 33010602011771号