我将用Eclipse Debugger中的图片进行解释
我有一个名为“FieldContext”的类,(我无法编辑它,它是在Java OVal API中编译的)
在eclipse变量选项卡上的“FieldContext”中有“CompileTimeType”和“field”
Q1变量选项卡中的图标是否有图例?喜欢带有“F”的红色盒子意味着+黄色钻石盒子?
现在我想访问“field”对象(RedBox)中的字段..最好是“名字”
但是“FieldContext”没有“getField()”方法,但它有一个“getCompileTimeType()”方法。
Q2那么无论如何从“FieldContext”获得该字段对象是“SerializableField”类?
如果eclipse调试器可以看到/获取/编辑它们,那么我希望我可以在Java中做同样的事情。
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`
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/
你需要使用Reflection API。有了它,你几乎可以做任何你喜欢的领域。
我不会讨论你是否应该访问它们,只是你可以反思。
你可以尝试使用Reflections同时查看this。
您使用的是什么版本的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
所以你似乎试图通过使用方形巨石重新发明轮子:)
此外,除非您要实现通用框架,或者需要实施紧急黑客,否则应避免使用反射访问非公共字段。
私人(可能)在附上的课程中有所变更;受保护的内容可能会在继承树中发生变化;和包范围的可以垂直更改。如果通过反射访问其工件,则此类代码的作者不会在语法和语义上做出任何保证。
通过反射将你的代码与它们联系起来是一种很好的方法,可以让它变得脆弱和脆弱,就像被西伯利亚苔原卷绕的风吹动的漂亮的矮牵牛一样;)