曹耘豪的博客

Java基础之利用反射访问private字段和方法

  1. 访问私有字段
  2. 访问私有方法
  3. 访问静态私有方法

有时,现有的类库接口不能满足我们的需求(它们往往封装的过好,隐藏了内部细节,以至于把这些细节都设为了private方法)。我们确实需要主动执行这些内部方法,以达到某种目的。大多数时候,这种需求会添加在该库的未来的版本中,但我们由于各种各样的原因不能升级,需要在当前版本满足我们的需求,问题来了,如何主动执行受保护的方法,答案是,反射。

有以下类A,我们要在外部访问它的 private 字段,执行它的 private 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class A {
private int intValue = 1;
private String strValue = "a";

public A(int intValue) {
this.intValue = intValue;
}

private int getIntValue() {
return intValue;
}

private static A of(int intValue) {
return new A(intValue);
}
}
访问私有字段
1
2
3
4
5
A a = new A(1);
Field field = A.class.getDeclaredField("intValue");
field.setAccessible(true); // 关键!
int fieldValue = (int) field.get(a);
System.out.println(fieldValue); // 1
访问私有方法
1
2
3
4
5
A a = new A(1);
Method getIntValueMethod = A.class.getDeclaredMethod("getIntValue");
getIntValueMethod.setAccessible(true); // 关键!
int intValue = (int) getIntValueMethod.invoke(a);
System.out.println(intValue); // 1
访问静态私有方法
1
2
3
4
Method staticMethod = A.class.getDeclaredMethod("of", int.class); // 第一个是方法名,第二个是函数参数的类型
staticMethod.setAccessible(true); // 关键!
A newA = (A) staticMethod.invoke(null, "A"); // 对于静态方法,第一个参数可以传任意类型的任意值
System.out.println(newA);
   /