Sav*_*sis 43 java reflection private-members
考虑这个例子:
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) {
C c = new C();
try {
Field f = C.class.getDeclaredField("a");
f.setAccessible(true);
Integer i = (Integer)f.get(c);
System.out.println(i);
} catch (Exception e) {}
}
}
class C {
private Integer a =6;
}
Run Code Online (Sandbox Code Playgroud)
允许您通过反射访问类的私有字段似乎不合逻辑.为什么有这样的功能?允许这种访问不是"危险的"吗?
jco*_*der 58
Private旨在防止意外滥用,而不是作为安全机制.如果您选择绕过它,那么您可以自担风险并假设您知道自己在做什么.
Joa*_*uer 22
安全管理器实际上检查了这两个getDeclaredField()并且setAccessible()在您的代码不允许执行此操作时将抛出异常.通常情况下,您不会注意到它,因为Java代码通常在没有安全管理器的情况下运行.
一个重要的例外是Applet,它总是与安全管理器一起运行.
pjp*_*pjp 10
是的,这并不好,但它确实允许Java序列化等框架工作.
在反射对象中设置可访问标志允许具有足够权限的复杂应用程序(例如Java对象序列化或其他持久性机制)以通常被禁止的方式操作对象.
我相信可以通过以下方式禁用该功能 SecurityManager
| 归档时间: |
|
| 查看次数: |
8061 次 |
| 最近记录: |