获取现有对象的成员/字段

时间:2014-10-17 08:28:21

标签: java object field member

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

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
}

此方法应返回一个List,其中包含每个not null对象,该对象是Class“searchingClass”的实例,并且是Object“from”的成员。

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

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

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

感谢您的回答

3 个答案:

答案 0 :(得分:0)

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

Reflection允许您在运行时检查类具有哪些成员变量和函数,以及读取和写入成员变量。

答案 1 :(得分:0)

我建议你看一下这篇文章:

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

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

1。)如果正在实现所需的接口

,请检查列表中的每个类

2.如果是这样,请使用Reflection方法根据http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

读取所需的“成员”(字段和/或方法)

另请注意,通过反射(它适用于JDK 1.4 lol ...),您可能仍然可以在运行时将private更改为public以读取所有这些字段。

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

答案 2 :(得分:0)

Field f = Class.getDeclaredField("fieldname");
Object o = f.get(ObjectToGetMemberFrom);

这对我来说是这样的:)