[英]How to restrict developers to use reflection to access private methods and constructors in Java?
如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
使用普通的Java代码,我们无法在类外部访问私有构造函数或私有方法。 但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数。
那么,如何为Java代码赋予安全性呢?
使用SecurityManager
和足够严格的安全策略运行您的应用程序。
在所有私有方法/构造函数中添加checkPermission()
方法。 通过assert callerClass=selfClass
sun.reflect.Reflection.getCallerClass(int n)
的callerClass=selfClass
。
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();
}
}
您(作为相关代码的开发人员)无法做到这一点。
运行该应用程序的最终用户可以安装一个禁止反射的SecurityManager。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.