当前位置: 首页 > 面试题库 >

Java反射-setAccessible(true)的影响

洪国兴
2023-03-14
问题内容

我正在使用一些注释来动态设置类中字段的值。由于我想执行此操作,而不管它是公共的,受保护的还是私有的,因此setAccessible(true)每次调用该set()方法之前,我都会在Field对象上进行调用。我的问题是,setAccessible()电话会议对该领域本身会产生什么样的影响?

更具体地说,假设它是一个私有字段,并且这组代码调用setAccessible(true)。如果代码中的其他位置要通过反射来检索相同的字段,那么该字段是否已经可以访问?还是getDeclaredFields()getDeclaredField()方法每次都返回Field对象的新实例?

我想说明问题的另一种方式是,如果我打电话setAccessible(true),完成后将其设置回原始值有多重要?


问题答案:

setAccessible()您更改的行为AccessibleObject,即Field实例,但不更改类的实际字段。这是文档(节选):

true表示使用该反射对象时,应禁止检查Java语言访问控制

和一个可运行的示例:

public class FieldAccessible {
    public static class MyClass {
        private String theField;
    }

    html" target="_blank">public static void main(String[] args) throws Exception {
        MyClass myClass = new MyClass();
        Field field1 = myClass.getClass().getDeclaredField("theField");
        field1.setAccessible(true);
        System.out.println(field1.get(myClass)); // no exception
        Field field2 = myClass.getClass().getDeclaredField("theField");
        System.out.println(field2.get(myClass)); // IllegalAccessException
    }

}


 类似资料:
  • 问题内容: 我使用Netbeans GUI Builder创建了一个GUI(称为ParameterUI),现在我想创建它的一个实例并显示它。但是,使用 不会导致任何窗口出现…测试表明,在这些命令之后,gui.isVisible()返回true,但是gui.isValid()为false。调用gui.revalidate()也无效。 在ParameterUI类中,构造函数方法由Netbeans生成,

  • 本小节我们来学习一个 Java 语言中较为深入的概念 —— 反射(reflection),很多小伙伴即便参与了工作,可能也极少用到 Java 反射机制,但是如果你想要开发一个 web 框架,反射是不可或缺的知识点。本小节我们将了解到 什么是反射,反射的使用场景,不得不提的 Class 类,如何通过反射访问类内部的字段、方法以及构造方法等知识点。 1. 什么是反射 Java 的反射(reflecti

  • 问题内容: 是否有与.NET Reflector等效的Java ? 编辑:更具体地说,反编译是我的追求。 问题答案: 我几乎不知道.NET Reflector的功能在包括Eclipse在内的几乎所有Java IDE中都可用。只需将文件添加到项目中,就可以像浏览自己的类一样浏览其类。 对于反编译器方面(与纯类浏览器相反),还有一些替代方法。JDK工具仅反编译为字节码,因此获取源代码并没有什么用(但是

  • 问题内容: 我试图使用反射从另一个类中获取方法,但是由于某种原因,它一直在给我提供这样的方法异常。这些是即时通讯使用的类: ScriptTable类: DummyScript类 问题答案: 这是你的问题: 更改为: 并查看此处以了解原因: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getMethod%28java.l

  • 此外,如果我可以动态地改变它,那么我需要这样做的迹象是什么?任何特定的异常或场景指出需要或? 谢了!