【问题标题】:help requested understanding Java Reflection --> Android ParcelableContainer帮助请求理解 Java Reflection --> Android ParcelableContainer
【发布时间】:2011-02-19 17:17:36
【问题描述】:

我正在使用 Android 框架并尝试让我的思想更深入地了解 Java。为此,我阅读了有关 Java 泛型和反射 API 的信息,但我并没有真正理解它。 因为我是一个懒惰的开发者;)我尝试编写一个“Parcelable-Container”,我可以在其中放置任何我希望将其 Parcelable 的对象,而无需使用 Java 反射方法再次为每个对象实现此功能。

我写了一个这样的测试方法:

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”的值?


添加: 我现在遇到了严重的问题。 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 对其使用反射。这是java反射能力的终结吗?我怎样才能得到?的类

【问题讨论】:

  • 回答你的第二个问题——使用 Field.get(),传入实例对象 (t)。
  • 如果我有多个成员,它会返回哪个字段?
  • field.get(对象,参数...)。您从该字段中获取您调用“get”的值,然后从传入的对象中获取值。

标签: java android generics reflection


【解决方案1】:

反射应该谨慎使用,或者如果可以避免,则根本不使用,尤其是不要作为绕过良好设计原则的一种方式。话虽如此,它在某些情况下也很有用......

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

【讨论】:

  • 谢谢,你说的都是对的。但正如我所写,它仅用于测试和学习目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多