11回复
4年前
java 反射调用 private 相关
java 反射调用时,默认超过 15 次就会生成 java 类进行调用,那么问题是这个生成的类中为什么可以调用 private 的方法。
测试代码
public class ReflectTest {
public static void main(String[] args) throws Exception {
Method priStr = ReflectTest.class.getDeclaredMethod("priStr");
priStr.setAccessible(true);
for (int i = 0; i < 16; i++) {
String s = priStr.invoke(null).toString();
System.out.println(s + i);
}
TimeUnit.SECONDS.sleep(1000000000);
}
private static String priStr() {
return "private string";
}
}
动态生成的类
package sun.reflect;
import com.example.demo.reflect.ReflectTest;
import java.lang.reflect.InvocationTargetException;
public class GeneratedMethodAccessor2 extends MethodAccessorImpl {
public Object invoke(Object var1, Object[] var2) throws InvocationTargetException {
try {
if (var2 != null && var2.length != 0) {
throw new IllegalArgumentException();
}
} catch (NullPointerException | ClassCastException var4) {
throw new IllegalArgumentException(var4.toString());
}
try {
return ReflectTest.priStr();
} catch (Throwable var3) {
throw new InvocationTargetException(var3);
}
}
public GeneratedMethodAccessor2() {
}
}
上述 GeneratedMethodAccessor2 类中,为什么 ReflectTest.priStr() 这个 private 的方法可以被调用。
5831 阅读