我将使用以下示例来描述我的问题:
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)方法。请帮助:)
感谢您的回答
答案 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);
这对我来说是这样的:)