我正在玩Android框架并尝试深入了解Java。为此,我阅读了有关Javas Generics和Reflection API的内容,而我并不理解它。 因为我是一个懒惰的开发人员;)我试着编写一个'Parcelable-Container',在其中我可以放置任何对象,我希望得到它Parcelable,而不需要使用Java Reflection的方法再次为每个Object实现它。
我写了一个像这样的测试方法:
public <T> void writeClassInformations(T t){
Class c = t.getClass();
System.out.println("DeclaredFields: ");
for (Field f : c.getDeclaredFields()){
System.out.println(f.toGenericString());
}
System.out.println("Fields: ");
for (Field f: c.getFields()){
System.out.println(f.toGenericString());
}
}
即使他们是对象或私人超级成员,我怎样才能获得每个成员? 另一个问题:输出是这样的:
public int hello.test.Testclass.myID
我如何获得'myID'的价值?
ADD:
我现在正在经历严重的问题。 Parcelable.Creator的界面迫使我写出一句话:public static final Parcelable.Creator CREATOR =
new Parcelable.Creator<ParcelableBox<?>>()
我可以用某种方式使用?
吗?通常我使用像ParcelableBox(E object)
这样的构造函数。虽然在我看来我不能在?
上使用Object方法,但我甚至无法将它传递给类变量,如
public ParcelableBox<?> createFromParcel(Parcel source){
...
return new ParcelableBox<?>();
}
或? myClass
使用反射。这是javas反射力量的终结吗?我怎样才能获得?
答案 0 :(得分:2)
如果可以避免反思,应该谨慎使用,或者根本不使用反思,尤其不应该反思好的设计原则。话虽这么说,它在某些情况下也很有用......
getDeclaredFields
可以返回所有类型的字段,而getFields
只返回标记为public的字段。
您的测试返回相同内容的原因是您在两个语句中都使用getDeclaredFields
。
how I get the value of 'myID'
您只能通过操作类的实例来实现。例如,
T t = ...
Field field = t.getClass().getDeclaredField("myID");
field.setAccessible(true);
String value = (String) field.get(t);