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

Sat*_*tya 24 java security reflection

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

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

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

Joa*_*uer 20

使用SecurityManager限制性足够严格的安全策略运行应用程序.

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


swa*_*liu 7

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

getCallerClass返回的类中的方法的realFramesToSkip帧在堆栈中向上(从零开始),忽略与相关联的帧java.lang.reflect.Method.invoke()和它的实现.第一帧是与此方法关联的帧,因此getCallerClass(0)返回Class对象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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以尝试测试反射,它会失败:

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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 嗯......但在我看来,确实是一个很好的尝试......不稳定的API不应该首先存在 (3认同)