如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
2022-09-01 19:13:50
如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
使用普通的Java代码,我们无法访问类外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数。
那么,我们如何为Java代码提供安全性呢?
如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
使用普通的Java代码,我们无法访问类外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数。
那么,我们如何为Java代码提供安全性呢?
在所有私有方法/构造函数中添加方法。检查权限 使用 断言 。checkPermission()
sun.reflect.Reflection.getCallerClass(int n)
callerClass=selfClass
返回方法的类,该方法在堆栈中向上帧(从零开始),忽略 与 关联的帧及其实现。第一帧是与此方法关联的帧,因此返回 的 Class 对象。getCallerClass
realFramesToSkip
java.lang.reflect.Method.invoke()
getCallerClass(0)
sun.reflect.Reflection
public class PrivateConstructorClass {
private PrivateConstructorClass() {
checkPerMission();
//you own code go below
}
void checkPerMission() {
Class self = sun.reflect.Reflection.getCallerClass(1);
Class caller = sun.reflect.Reflection.getCallerClass(3);
if (self != caller) {
throw new java.lang.IllegalAccessError();
}
}
}
你可以尝试测试反射,它会失败:
public class TestPrivateMain {
Object newInstance() throws Exception {
final Class<?> c = Class.forName("package.TestPrivate");
final Constructor<?> constructor = c.getDeclaredConstructor();
constructor.setAccessible(true);
return constructor.newInstance();
}
public static void main(String[] args) throws Exception {
Object t = new TestPrivateMain().newInstance();
}
}