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

2022-09-01 19:13:50

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

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

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


答案 1

使用安全管理器和限制性足够严格的安全策略运行应用程序。

本教程中有一个简短的摘要,在安全文档中有大量信息。


答案 2

在所有私有方法/构造函数中添加方法。检查权限 使用 断言 。checkPermission()sun.reflect.Reflection.getCallerClass(int n)callerClass=selfClass

返回方法的类,该方法在堆栈中向上帧(从零开始),忽略 与 关联的帧及其实现。第一帧是与此方法关联的帧,因此返回 的 Class 对象。getCallerClassrealFramesToSkipjava.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();
    }
}