例如,我有一些包含多个字段的类,其中一个如下所示,我想输出其实例的所有字段,但是,我必须使用getter方法获取成员名称之间的映射,我可以得到它通过反思?
public class MappingMemberWithGetterOrSetter {
private String memberOne;
private int memberTwo;
public String getMemberOne() {
return memberOne;
}
public void setMemberOne(String memberOne) {
this.memberOne = memberOne;
}
public int getMemberTwo() {
return memberTwo;
}
public void setMemberTwo(int memberTwo) {
this.memberTwo = memberTwo;
}
}
答案 0 :(得分:2)
也许这就是你想要的。使用Introspector,您可以获得BeanInfo,这样您就可以访问bean的PropertyDescriptors。
BeanInfo beanInfo = Introspector.getBeanInfo(MappingMemberWithGetterOrSetter.class, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
String propertyName = propertyDescriptor.getName();
Method getter = propertyDescriptor.getReadMethod();
Method setter = propertyDescriptor.getWriteMethod();
Field field = MappingMemberWithGetterOrSetter.class
.getDeclaredField(propertyName);
System.out.println("Property " + propertyName + " field: " + field);
System.out.println("Getter " + getter);
System.out.println("Setter " + setter);
}
答案 1 :(得分:0)
这是你想要的吗?
Class aClass = ...//obtain class object
Field[] methods = aClass.getFields();
Field field = ... //obtain field object
String fieldName = field.getName();
之后,您可以通过
访问该字段的getter和setterObject value = field.get(objectInstance);
field.set(objetInstance, value);
其中objectInstance是拥有该字段的类的实例。
答案 2 :(得分:0)
public void getMethods(Class<?> className)
{
Method[] methods = className.getMethods();
for(Method method : methods)
{
if(method.getDeclaringClass().getName().equalsIgnoreCase("java.lang.Object") )
{
//Do nothing
}
else
{
if(StringUtils.startsWith( method.getName(),"get"))
{
//Here u ll get all get methods
}
}
}
答案 3 :(得分:0)
Java中的属性由getter和/或setter定义。如果你有一个没有参数的getLength
方法并且返回值,那么你有一个名为length
的可读属性。如果您有一个名为setLength(Type value)
的方法,那么您将拥有一个名为length
的可写属性。如果你有两个属性,那么该属性是可读写的。
字段不参与Java属性的定义。如何以及如果您使用字段支持您的属性取决于您。
public long getDoubleLength() { return getLength()*2; }
构成名称doubleLength
的只读属性。此属性不存在任何字段。
所以你想要的一般是不可能的。如果你想知道这个映射存在的特定自己的类,或者你想测试这个模式的其他类,那么你可以通过反射获取方法和字段,并检查是否存在具有属性名称的字段。
但这可能不会一直有效。有些人使用_member
或mField
等惯例作为字段名称。这与Java Beans定义完全相同,其中属性由getter和setter定义,但会破坏匹配名称的天真方法。