【问题标题】:Get Member/Fields of an existing Object获取现有对象的成员/字段
【发布时间】:2014-10-17 08:28:21
【问题描述】:

我将用以下示例描述我的问题:

public class Person{

  private int age;
  private String name;

  public Person(int age, String name){
    this.age = age;
    this.name = name;
  }
}

我的班级有一些成员(在这种情况下是年龄和姓名),但我不知道我的班级有哪些成员以及有多少成员。我什至不在乎数量或类型。我不想只获得一个班级的所有成员。像这样:

private List<Object> getAll(Class searchedClass, Object from){
  // This is where the magic happens
}

此方法应返回一个列表,其中包含每个非空对象,该对象是“searchedClass”类的实例,并且是“from”对象的成员。

在我的例子中,我有一个名为 Property 和 PropertyContainerList 的类以及一个名为 PropertyContainer 的接口。 PropertyContainerList 只能包含实现我的接口 PropertyContainer 的对象。所以一个类可以有 10 个属性作为成员,另一个有 5 个属性,但可以添加两者的对象。属性具有方法 addListener(...)。我希望,每次将一个对象添加到我的列表中时,为该对象的每个“属性”成员添加一个侦听器。就像这样:

if(instance of PropertyContainer is added){
  List<Property> properties = getAll(Property.class, propertyContainerObject);
  for(Property property : properties)
    property.addListener(new Listener());
}

我尝试了一些东西,但我不知道如何实现 getAll(Class, Object) 方法。请帮忙:)

感谢解答

【问题讨论】:

  • 我完全不清楚PropertyPerson 有什么关系(根本没有提到Property)。基本上,我不明白你的问题——如果你能给出一个更具体的例子in code而不是仅仅描述一半的代码会更清楚。
  • 我不确定getAll 应该发生什么样的魔法?你想反省吗?或者搜索某种类型的对象?
  • 这里也一样。我的解释只是“反射是他想要的吗?”在这种情况下,请查看docs.oracle.com/javase/tutorial/reflect/class/classMembers.html 或请详细描述 getAll-Methods 所需的功能(我也不清楚您的 Person、getAll 和 PropertyContainer 之间的联系)
  • 好吧...我又读了一遍,我认为 getAll 方法应该做什么很清楚,我研究了一下(但是我看不到与该属性的任何关系)

标签: java object field member


【解决方案1】:
Field f = Class.getDeclaredField("fieldname");
Object o = f.get(ObjectToGetMemberFrom);

这是为我做的:)

【讨论】:

  • 好吧,那我不用继续了,玩得开心。
【解决方案2】:

您可能需要的是反思。阅读reflection trail in the Java tutorial

反射允许您在运行时检查一个类有哪些成员变量和函数,并读取和写入成员变量。

【讨论】:

    【解决方案3】:

    我建议你看看这篇文章:

    Java - Get a list of all Classes loaded in the JVM

    关于如何加载某个包或整个 JVM 中的所有类。 一旦所有已加载/已知类的列表可用,您将必须:

    1.) 检查列表中的每个类是否实现了所需的接口

    2.) 如果是这样,请使用反射方法根据 http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html 读取所需的“成员”(字段和/或方法)

    还请注意,通过反射(它与 JDK 1.4 一起工作,哈哈...)您可能仍然能够在运行时将私有更改为公共以读取所有这些字段。

    注意:要获得“所有”类的列表,我将依赖这个谷歌库,而不是从头开始: http://code.google.com/p/reflections/downloads/detail?name=reflections-0.9.9-RC1-uberjar.jar&can=2&q=

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多