【问题标题】:Java: How do you access a sub-object of an object with no "getXXX" method to that sub-objectJava:如何访问没有“getXXX”方法的对象的子对象到该子对象
【发布时间】:2009-10-04 21:59:45
【问题描述】:

我会用来自 Eclipse Debugger 的图片来解释

我有一个名为“FieldContext”的类,(我无法编辑它,它是在 Java OVal API 中编译的)

在 Eclipse 变量选项卡上的“FieldContext”中是“CompileTimeType”和“field”

Q1 变量标签中的图标是否有图例?比如带“F”的红色方框+黄色菱形方框是什么意思?

现在我想访问“字段”对象(RedBox)中的字段..最好是“名称”

但是“FieldContext”没有“getField()”方法,却有“getCompileTimeType()”方法。

Q2那么有没有办法让该字段对象成为“FieldContext”中的“SerializableField”类?

如果 eclipse 调试器可以看到/获取/编辑它们,那么我希望我可以在 Java 中做同样的事情。

【问题讨论】:

    标签: java eclipse debugging class object


    【解决方案1】:

    Q1:我认为黄色表示protected,红色表示private。 “F”表示final

    Q2:这可以使用反射来完成。假设有一个类C 有一个私有成员字段pm,并且你想访问instanceOfC.pm,这就是要走的路:

    /* exception stuff ommitted (for readability and shortness) */
    C instanceOfC = new C();
    
    Class<? extends C> clazz = instanceOfC.getClass();
    Field f = clazz.getDeclaredField("pm");
    f.setAccessible(true);
    
    ... = f.get(instanceOfC);  //<-- this will get you the value of `c.pm`
    

    您可能应该阅读ClassFieldMethod 的JavaDoc

    【讨论】:

      【解决方案2】:

      Q1:F的意思是“final”,所以不能通过代码直接访问来正常修改字段的内容。黄色菱形表示它是受保护的区域。红色方块表示它是私有领域。如果是绿色圆圈,则表示它是公开的。

      关于eclipse调试的一些信息,不仅仅是传说:

      http://www.ibm.com/developerworks/library/os-ecbug/

      Q2:您可以使用反射来访问类中的任何字段并调用任何方法(如果安全设置允许)。反射是一种允许您“内省”任何类并通过名称访问成员的技术。

      网上有几个关于如何使用反射的教程:

      http://java.sun.com/docs/books/tutorial/reflect/

      http://java.sun.com/developer/technicalArticles/ALT/Reflection/

      【讨论】:

      • 澄清一下,您可以通过反射更改“最终”字段。不能通过普通语言,系统对final做了一些假设,但是反射API可以改变值。
      • 谢谢,一些很棒的资源,但是如果你能找到一个 Eclipse 图标图例,我会很感激的
      • 我曾经要求他们在悬停时提供解释,但没有。如果图标有 F 则为 final,如果图标有 S 则为静态。
      • 查看此站点以获取图标列表及其含义:publib.boulder.ibm.com/infocenter/wasinfo/v6r0/topic/…
      【解决方案3】:

      您需要使用Reflection API。有了它,您几乎可以对这些字段做任何您喜欢的事情。

      我不会讨论你是否应该访问它们,只是你可以通过反射来讨论。

      【讨论】:

        【解决方案4】:

        您可以尝试使用Reflections 也可以查看this

        【讨论】:

          【解决方案5】:

          您使用的是什么版本的 OVal?

          我问是因为 FieldContext 类确实有一个 getField() 方法:

          http://oval.sourceforge.net/api/net/sf/oval/context/FieldContext.html#getField%28%29

          返回类型是具有 getName() 访问器的 java.lang.reflect.Field:

          http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html#getName%28%29

          所以你似乎试图通过使用方形巨石来重新发明轮子:)

          此外,除非您正在实施通用框架,或者您需要实施紧急破解,否则您应该避免使用反射访问非公共字段。

          Private (意在)在封闭类中会发生变化;受保护的可能会在继承树中发生变化;和包范围的可能会垂直变化。如果通过反射访问其工件,则此类代码的作者不做任何保证(语法和语义上)。

          通过反射将你的代码绑定到它们是一种很好的方法,可以让它变得脆弱,就像被西伯利亚苔原的风吹过的漂亮矮牵牛一样;)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-12
            • 1970-01-01
            • 2015-12-28
            • 1970-01-01
            • 2016-03-31
            • 2015-09-22
            • 1970-01-01
            相关资源
            最近更新 更多