如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
使用普通的Java代码,我们无法访问类外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数。
那么我们如何为Java代码提供安全性呢?
答案 0 :(得分:18)
使用SecurityManager
和足够严格的security policy运行您的应用程序。
short summary in the tutorial中有the security documentation和广泛的信息。
答案 1 :(得分:7)
在所有私有方法/构造函数中添加checkPermission()
方法。
通过断言sun.reflect.Reflection.getCallerClass(int n)
使用callerClass=selfClass
进行checkPermission。
getCallerClass
返回方法realFramesToSkip
的类向上堆栈(从零开始),忽略与java.lang.reflect.Method.invoke()
相关联的帧及其实现。第一帧是与此方法相关联的,因此getCallerClass(0)
返回sun.reflect.Reflection
的Class对象。
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();
}
}
答案 2 :(得分:1)
您(作为相关代码的开发人员)无法做到这一点。
运行应用程序的最终用户可以安装禁止反射的SecurityManager。