繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM