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

时间:2011-09-27 09:07:25

标签: java security reflection

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

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

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

3 个答案:

答案 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。