一般在其他类中是不能这个得到类中private属性和访问private方法的,但天无绝人之路,java强大的反射机制可以完成这个任务。
建一个测试类A:
package com.shao.test;
public class A {
private String testStr="just for test";
private void get(int index,String value){
System.out.println(index+":"+value+" and testStr:"+testStr);
}
}
现在我们来访问A中的testStr属性和get方法:
package com.shao.test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class B {
public static void main(String[]args) throws ClassNotFoundException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException{
Field field=Class.forName("com.shao.test.A").getDeclaredField("testStr");
field.setAccessible(true);
A a=new A();
System.out.println(field.getType().toString()); //print:class java.lang.String
System.out.println(field.getName()); //print:testStr
System.out.println(field.getModifiers()); //print:2
Object s=field.get(a);
System.out.println(s); //print:just for test
String x="Hello";
field.set(a, x);
System.out.println(field.get(a)); //print:Hello
Method method=Class.forName("com.shao.test.A").getDeclaredMethod("get", new Class[]{int.class,String.class});
method.setAccessible(true);
method.invoke(a, 3,"apples"); //print:3:apples and testStr:Hello
}
}
属性使用Filed类获取,方法使用Method类去调用。