帮助请求理解Java反射 - > Android ParcelableContainer

时间:2011-02-19 17:17:37

标签: java android generics reflection

我正在玩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反射力量的终结吗?我怎样才能获得?

的等级

1 个答案:

答案 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);