Java:接受任何类的任何属性参数的方法

时间:2014-01-23 14:38:33

标签: java

我需要创建一个方法,它接受参数任何类的任何属性。但我不希望它是String类型,以避免在重命名属性时重构问题并在eclipse的 Markers 选项卡中获取错误,而不是在运行我的应用程序时。

有一个人类:

public class Person {

    private String name;
    // other attributes...

    // getters and setters...

}

现在需要的方法:

void getAnAttributeOfAClass( <which_type_or_class_here?> attr_as_arg){

   // Now I need to get the name of attribute that would be of class Strin...

}

是否有函数或方法,我们可以通过它来指定属性?

例如:

Person.class.name

是否属于属性

修改

更确切地说(@Smallhacker回答帮助了我),我需要在编译时验证参数是否真的是指定类的属性。

Person.class.name // no compile time error
Person.class.nameXXX // compile time error

4 个答案:

答案 0 :(得分:2)

最接近您想要的是Reflection API的Field或JavaBeans Introspector API的PropertyDescriptor

但是Java项目通常不需要这样的东西,因为有些库可以处理这些问题。

您可以传递Class对象和String名称,然后让您的方法在内部使用Introspector来读取该属性。

答案 1 :(得分:1)

我不确定我是否理解你,但是有一个类java.lang.reflect.Field,它有一个getName()方法,可以给出你的字段名称。

在您的示例中,要获取字段名称,您可以执行以下操作:Person.class.getDeclaredField(“name”)。

编辑:要获取对象中字段的值,您可以这样做:field.get(obj);

好的,假设您有以下变量:

Person person = ...; // initialized with some Person
Field nameField = Person.class.getDeclaredField("name");

现在要获得人名,你会这样做:

String personName = (String)nameField.get(person);

实际上,这会引发异常,因为name是私有字段。但是,您可以通过执行以下操作来绕过保护:

nameField.setAccessible(true);

答案 2 :(得分:0)

不幸的是,Java缺乏以可在编译时分析的方式引用成员变量的能力。

可能有某种类型的库可以简化这一点,但由于语言本身的限制,它无法提供完整的解决方案。

答案 3 :(得分:0)

也许java generics可以帮助你。

您可以执行以下操作:

class YourClass<E> {
    void getAnAttributeOfAClass(E attr_as_arg){

        // some code

    }        
}

someVariable = new YourClass<Person>();

someVariable.getAnAtributeOfAClass(someObject); //this will not compile if someObject is not an instance of Person

但我仍然不知道你想在方法中做些什么。