メンバーにゲッター/セッターメソッドをマッピングすることは可能ですか?

StackOverflow https://stackoverflow.com/questions/20353966

  •  25-08-2022
  •  | 
  •  

質問

たとえば、いくつかのフィールドを備えたクラスがいくつかあります。そのうちの1つは以下のようです。インスタンスのすべてのフィールドを出力したいのですが、メンバー名の間のマッピングをゲッターメソッドで取得する必要があります。

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;
}
}
役に立ちましたか?

解決

多分これはあなたが望むものです。とともに 内省者 あなたは得ることができます beaninfo そして、これにより、豆にアクセスできます 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);
}

他のヒント

これは、あなたの望むことですか?

Class aClass = ...//obtain class object
Field[] methods = aClass.getFields(); 

Field field = ... //obtain field object
String fieldName = field.getName();

その後、フィールドのゲッターとセッターにアクセスできます

Object value = field.get(objectInstance);

field.set(objetInstance, value);

ObjectInstanceは、フィールドを所有するクラスのインスタンスです。

Javaのプロパティは、Getterおよび/またはSetterによって定義されます。あなたが持っている場合 getLength パラメーターのない方法と返品値を使用すると、読み取り可能なプロパティがあります length. 。呼ばれるメソッドがある場合 setLength(Type value) その後、あなたは呼ばれる書き込み可能なプロパティを持っています length. 。両方がある場合、プロパティは読みやすく、書き込み可能です。

フィールドは、Javaプロパティの定義には関与していません。フィールドであなたのプロパティをどのようにバックバックするかはあなた次第です。

public long getDoubleLength() { return getLength()*2; }

名前の読み取り専用プロパティを構成します doubleLength. 。このプロパティにはフィールドは存在しません。

したがって、あなたが望むものは一般的に不可能です。このマッピングが存在することがわかっている特定のクラスのためにやりたい場合、またはこのパターンの他のクラスをテストしたい場合は、反射を介してメソッドとフィールドを取得し、プロパティ名のフィールドが存在するかどうかを確認できます。

しかし、これは常に機能しないかもしれません。一部の人々は、ような慣習を使用しています _member また mField フィールド名の場合。これは、プロパティがゲッターとセッターによって定義されているが、名前を一致させる素朴なアプローチで壊れるJava Beansの定義と完全に同等です。

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                         
                    }
             }                              
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top