一般而言,一个类只允许访问另一个类中的public
然而当我们非要访问私有成员的时候,这时候Java的反射机制就用得上了。
package com.comac.reflect;
public class A {
private String testStr="just for test";
private void get(int index, String value){
System.out.println(index+":"+value+" and testStr:"+testStr);
}
}
类B要访问类A中的私有成员。
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.comac.reflect.A").getDeclaredField("testStr");
field.setAccessible(true);
A a = new A();
System.out.println(field.getType().toString());
System.out.println(field.getName());
System.out.println(field.getModifiers());
Object s = field.get(a);
System.out.println(s);
String x = "hello";
field.set(a, x);
System.out.println(field.get(a));
Method method = Class.forName("com.comac.reflect.A").getDeclaredMethod("get", new Class[]{int.class, String.class});
method.setAccessible(true);
method.invoke(a, 3, "apple");
}
}