Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制开发人员使用反射来访问Java中的私有方法和构造函数?_Java_Security_Reflection - Fatal编程技术网

如何限制开发人员使用反射来访问Java中的私有方法和构造函数?

如何限制开发人员使用反射来访问Java中的私有方法和构造函数?,java,security,reflection,Java,Security,Reflection,如何限制开发人员使用反射来访问Java中的私有方法和构造函数 使用普通Java代码,我们不能访问类之外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数 那么,我们如何为Java代码提供安全性呢?使用一个和一个足够严格的 中有大量的信息。您(作为相关代码的开发人员)无法做到这一点 运行应用程序的最终用户可以安装禁止反射的SecurityManager。在所有私有方法/构造函数中添加checkPermission()方法。 使用assertcallerCl

如何限制开发人员使用反射来访问Java中的私有方法和构造函数

使用普通Java代码,我们不能访问类之外的私有构造函数或私有方法。但是通过使用反射,我们可以访问Java类中的任何私有方法和构造函数


那么,我们如何为Java代码提供安全性呢?

使用一个和一个足够严格的

中有大量的信息。

您(作为相关代码的开发人员)无法做到这一点

运行应用程序的最终用户可以安装禁止反射的SecurityManager。

在所有私有方法/构造函数中添加
checkPermission()
方法。 使用assert
callerClass=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一开始就不应该存在