有些情况下我们需要访问某个类中的变量或方法,但是这个变量或方法被申明为private或protected,如果想要直接访问,可以借助Java的反射机制。 如:某个类如下:package com.docworks;/** * @author liuwei * @version 1.0 */public class Cat {
private int weight;
protected void eat() {
System.out.println("I am full, weight is: " + weight + "KG");
}} 通过Java反射机制,可以直接访问成员变量weight和eat方法。import com.docworks.Cat;import java.lang.reflect.Field;import java.lang.reflect.Method;/** * @author liuwei * @version 1.0 */public class Test {
public static void main(String[] args) {
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Class clazz = classLoader.loadClass("com.docworks.Cat");
Cat cat = (Cat) clazz.newInstance();
Field field = clazz.getDeclaredField("weight");
field.setAccessible(true);
field.setInt(cat, 10);
System.out.println(field.getInt(cat));
Method method = clazz.getDeclaredMethod("eat", null);
method.setAccessible(true);
method.invoke(cat, null);
} catch (Exception e) {
e.printStackTrace();
}
}} 运行结果: 10I am full, weight is 10kgProcess finished with exit code 0