首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过反射阻止访问?

如何通过反射阻止访问?
EN

Stack Overflow用户
提问于 2015-03-25 01:39:18
回答 2查看 7.5K关注 0票数 13

在Java中,它提到使用f.setAccessible(true)方法可以违背封装的原则。

但是,如果我正在编写任何具有完全安全性的类,例如带有私有变量的类,那么如何防止反射访问它呢?

例如,我有一个具有完全安全实例变量的类:

代码语言:javascript
复制
public final class Immutable {
    private final int someVal;

    public Immutable(int someVal) {
        this.someVal = someVal;
    }

    public int getVal() {
        return someVal;
    }
}

但是我可以使用这样的反射来修改实例变量:

代码语言:javascript
复制
public class Tester {
    public static void main(String[] args)
            throws NoSuchFieldException, SecurityException,
            IllegalArgumentException, IllegalAccessException {

        Immutable i = new Immutable(10);

        // output 10
        System.out.println(i.getVal());

        Field f = i.getClass().getDeclaredField("someVal");
        f.setAccessible(true);
        f.set(i, 11);

        // output is 11 which implies some value modified
        System.out.println(i.getVal());
    }
}

在我的代码中,如何防止使用反射更改不可变类?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-25 01:50:21

JVM内置了安全机制,允许您定义通过Java安全策略文件编码的限制。Java安全管理器使用Java安全策略文件强制执行授予类的一组权限。权限允许在JVM实例中运行的指定类允许或不允许某些运行时操作。如果启用了Java安全管理器,但没有指定安全策略文件,则Java安全管理器将使用$JAVA_HOME/jre/lib/ java.policy目录中定义的默认安全策略和java.policy文件。在这里可以找到定义策略文件的http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

票数 10
EN

Stack Overflow用户

发布于 2017-06-17 07:12:20

扩展SecurityManager类并重写此方法以限制反射访问

代码语言:javascript
复制
@Override
public void checkPackageAccess(String pkg){

         // don't allow the use of the reflection package
         if(pkg.equals("java.lang.reflect")){
             throw new SecurityException("Reflection is not allowed!");
         }
     }
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29246028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档