我需要创建一个方法,它接受参数任何类的任何属性。但我不希望它是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
答案 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
但我仍然不知道你想在方法中做些什么。