本文主要举例,获取其他类的:私有变量的值,调用成员方法,调用私有构造方法(包括带参数和不带参数的方法)
拥有私有变量,私有成员方法和私有构造方法的内。
package FanShe;
public class MyData {
private static final int a = 1;
private void eat(){
System.out.println("调用了无参方法eat");
}
private MyData(){
System.out.println("调用了无参构造方法");
}
private void eat(int param){
System.out.println("调用了有一个参数的方法eat,参数的值是:"+param);
}
private MyData(int param1,int param2){
System.out.println("调用了有两个参数的构造方法,参数的值是:"+param1+" 和"+param2);
}
}
调用MyData中的私有成员方法和构造方法,以及访问私有变量的类。
package FanShe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class myClass = Class.forName("FanShe.MyData");//包名加类名
//调用无参数私有构造方法,参数是构造方法的参数的类型类,没有参数就传入null
Constructor constructor=myClass.getDeclaredConstructor(null);
constructor.setAccessible(true);//使可以访问private域
MyData myData= (MyData) constructor.newInstance();
//调用两参数私有构造方法需要注意的是此处不能用Integer.class
Constructor constructor2=myClass.getDeclaredConstructor(int.class,int.class);
constructor2.setAccessible(true);
constructor2.newInstance(1,2);
//获取私有变量值
Field field = myClass.getDeclaredField("a");
field.setAccessible(true);
System.out.println("私有变量a的值是:"+field.get(myData));
//调用无参私有方法
Method method = myClass.getDeclaredMethod("eat");
method.setAccessible(true);
method.invoke(myData);
//调用有参数私有方法
Method method2 = myClass.getDeclaredMethod("eat",int.class);
method2.setAccessible(true);
method2.invoke(myData,12);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
结果:
也许事先不知道有哪些方法,构造方法或变量,可以先将私有方法,私有变量及构造方法,罗列打印出来:
try {
Class myClass = Class.forName("FanShe.MyData");//包名加类名
//打印所有方法
System.out.println("\n打印所有方法");
Method[] methods = myClass.getDeclaredMethods();
for (Method m:methods) {
System.out.println(m.toString());
}
//打印所有变量
System.out.println("\n打印所有变量");
Field[] fields = myClass.getDeclaredFields();
for (Field f:fields) {
System.out.println(f.toString());
}
//打印所有构造方法
System.out.println("\n打印所有构造方法");
Constructor[] constructors = myClass.getDeclaredConstructors();
for (Constructor c:constructors) {
System.out.println(c.toString());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
结果比较清晰