Java:如何访问没有“getXXX”方法的对象的子对象到该子对象

问题描述 投票:1回答:5

我将用Eclipse Debugger中的图片进行解释

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

在eclipse变量选项卡上的“FieldContext”中有“CompileTimeType”和“field”

alt text

Q1变量选项卡中的图标是否有图例?喜欢带有“F”的红色盒子意味着+黄色钻石盒子?

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

alt text

但是“FieldContext”没有“getField()”方法,但它有一个“getCompileTimeType()”方法。

Q2那么无论如何从“FieldContext”获得该字段对象是“SerializableField”类?

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

java eclipse debugging class object
5个回答
3
投票

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表示“最终”,因此,通过直接访问代码无法正常修改字段的内容。黄色钻石意味着它是一个受保护的领域。红色方块意味着它是一个私人领域。如果它是一个绿色圆圈,那就意味着它是公开的。

关于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/


1
投票

你需要使用Reflection API。有了它,你几乎可以做任何你喜欢的领域。

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


1
投票

你可以尝试使用Reflections同时查看this


1
投票

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

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

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

返回类型是java.lang.reflect.Field,它有一个getName()访问器:

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

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

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

私人(可能)在附上的课程中有所变更;受保护的内容可能会在继承树中发生变化;和包范围的可以垂直更改。如果通过反射访问其工件,则此类代码的作者不会在语法和语义上做出任何保证。

通过反射将你的代码与它们联系起来是一种很好的方法,可以让它变得脆弱和脆弱,就像被西伯利亚苔原卷绕的风吹动的漂亮的矮牵牛一样;)

© www.soinside.com 2019 - 2024. All rights reserved.