请求帮助理解Java Reflection --> Android ParcelableContainer

发布于 2024-10-17 23:26:19 字数 1298 浏览 3 评论 0 原文

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

我编写了这样的测试方法:

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(E object) 这样的构造函数。虽然在我看来,我无法在 ? 上使用对象方法,但我什至无法将其传递到类变量中,例如

public ParcelableBox<?> createFromParcel(Parcel source){  
  ...
  return new ParcelableBox<?>(); 
}

? myClass 在其上使用反射。这是javas反射能力的终结吗?我怎样才能获得的类?

I'm, playing with the Android framework and try to get my mind deeper into Java. For This I read about Javas Generics and the Reflection API, while I'm not understanding it really.
Because I'm a lazy Dev ;) I tried to write an 'Parcelable-Container' in which I can put ANY Object I wish to get it Parcelable without the need to implement this for every Object again using methods of Java Reflection.

I write a test method like these:

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

How can I get every member even if they are Objects or private Superclass members?
And another Question: The output is like this:

public int hello.test.Testclass.myID

how I get the value of 'myID'?


ADD:
I'm running in serious problems now. The Interface of Parcelable.Creator forces me to write a statement like: public static final Parcelable.Creator CREATOR =
new Parcelable.Creator<ParcelableBox<?>>()

Can I use ? somehow? Normally I use a constructor like ParcelableBox(E object). While it seems to me that I can't use Object methods on ? I even cannot pass it into a class variable like

public ParcelableBox<?> createFromParcel(Parcel source){  
  ...
  return new ParcelableBox<?>(); 
}

or ? myClass to use Reflection on it. Is this the end of javas reflection power? How can I get Class of ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明天过后 2024-10-24 23:26:19

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

getDeclaredFields 可以返回所有类型的字段,而 getFields 仅返回标记为公共的字段。

您的测试返回相同内容的原因是您在两个语句中都使用了 getDeclaredFields。


如何获取“myID”的值

您只能通过操作类的实例来实现这一点。例如,

T t = ...
Field field = t.getClass().getDeclaredField("myID");
field.setAccessible(true);
String value = (String) field.get(t);

Reflection should be used sparingly, or not at all if it can be avoided, and especially not as a way to hack around good design principles. That being said, it can also be useful in certain situations ...

getDeclaredFields can return all types of fields while getFields only returns fields marked public.

The reason your test returns the same thing is that you're using getDeclaredFields in both statements.


how I get the value of 'myID'

You can only do that by operating on an instance of a class. E.g.,

T t = ...
Field field = t.getClass().getDeclaredField("myID");
field.setAccessible(true);
String value = (String) field.get(t);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文