java - 为什么Java Reflect可以访问私有(private)字段/方法?

标签 java code-access-security

在Java中,我们可以这样写

Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null); // private void say() 
method.setAccessible(true);
method.invoke(f, null);

为什么Java Reflect API可以访问这样的方法? JVM 有什么魔力吗?

这是一些“java安全属性”吗?

我尝试使用 asm.jar 编写对此类方法/字段的字节码字典访问,但​​失败了。它总是抛出:

Exception in thread "main" java.lang.IllegalAccessError: tried to access field org.nutz.Abc.name from class sun.net.wendal.V$1
    at sun.net.wendal.V$1.run(V.java:14)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.wendal.V.main(V.java:11)

我尝试围绕 AccessController.doPrivileged 调用它,但也失败了。

最佳答案

JVM 可以通过称为运行时类型信息 (RTTI) 的技术在运行时检查任何类。这是通过一种称为 Class 对象的特殊对象来完成的,其中包含有关该类的信息。

Classjava.lang.reflect库支持反射的概念。所以使用类Class的对象,jvm可以实例化,也可以调用该类的方法/构造函数。

请检查类API:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

关于java - 为什么Java Reflect可以访问私有(private)字段/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13787440/

相关文章:

security - 在开发过程中防止源代码被盗

网络共享上的 .NET 安全异常

java - Android - SQLite 向数据库添加更多表时出现问题

java - 是否可以摆脱 wait()、notify() 和synchronized(obj) {} 并仅使用同步方法?

java - 有没有办法了解 Job<Void> 是否成功完成?

c# - 如何限制对程序集的访问?

C# 3.5 winforms app升级到C#4.0 排除CAS问题

c# - 沙盒异常 "Derived types must either match the security accessibility of the base type or be less accessible."

java - 有没有适用于 JAVA 的 HLSL 或 HYDRA Pixel Shader 语言?

java - 收到错误 500 但返回 ok()