如何限制开发人员使用反射来访问Java中的私有方法和构造函数?
如何限制开发人员使用反射来访问Java中的私有方法和构造函数 使用普通Java代码,我们不能访问类之外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数如何限制开发人员使用反射来访问Java中的私有方法和构造函数?,java,security,reflection,Java,Security,Reflection,如何限制开发人员使用反射来访问Java中的私有方法和构造函数 使用普通Java代码,我们不能访问类之外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数 那么,我们如何为Java代码提供安全性呢?使用一个和一个足够严格的 中有大量的信息。您(作为相关代码的开发人员)无法做到这一点 运行应用程序的最终用户可以安装禁止反射的SecurityManager。在所有私有方法/构造函数中添加checkPermission()方法。 使用assertcallerCl
那么,我们如何为Java代码提供安全性呢?使用一个和一个足够严格的 中有大量的信息。您(作为相关代码的开发人员)无法做到这一点 运行应用程序的最终用户可以安装禁止反射的SecurityManager。在所有私有方法/构造函数中添加
checkPermission()
方法。
使用assertcallerClass=selfClass
使用sun.reflect.Reflection.getCallerClass(int n)检查权限
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();
}
}
公共类TestPrivateMain{
对象newInstance()引发异常{
最终类c=Class.forName(“package.TestPrivate”);
最终构造函数=c.getDeclaredConstructor();
constructor.setAccessible(true);
返回构造函数.newInstance();
}
公共静态void main(字符串[]args)引发异常{
对象t=newTestPrivateMain().newInstance();
}
}
他当然可以。他在应用程序启动期间安装安全管理器。除非他是应用程序的开发人员,否则这不是一个选项。我在考虑更多的情况,他“想限制开发人员(可能是应用程序的开发人员)对他希望保持私有的方法使用反射”。是什么阻止他在类中安装静态初始值设定项来安装安全管理器?如果laoding类不能安装它,ofc Throw是一个阻止它的异常?这对于签名JAR来说是一个不错的选择。“在任何情况下,都不允许对此jar文件中的类进行反射”。但我认为,没有这样的功能。嗯……但在我看来,这确实是一次很好的尝试……不稳定的API一开始就不应该存在