20

以下のクラスがあり、Java リフレクションを使用して getter メソッドからフィールド名を取得する必要があります。getter メソッドを使用してフィールド名またはプロパティ名を取得することはできますか?

class A {

    private String name;
    private String salary;

    // getter and setter methods
}

私の質問は: getter メソッドでフィールド/プロパティ名を取得できますか? getName() を使用すると、name プロパティを取得できますか? name プロパティが必要ですが、その値は必要ありません。Javaリフレクションを介して可能ですか?

4

11 に答える 11

20

はい、100%可能です..

public static String getFieldName(Method method)
{
    try
    {
        Class<?> clazz=method.getDeclaringClass();
        BeanInfo info = Introspector.getBeanInfo(clazz);  
        PropertyDescriptor[] props = info.getPropertyDescriptors();  
        for (PropertyDescriptor pd : props) 
        {  
            if(method.equals(pd.getWriteMethod()) || method.equals(pd.getReadMethod()))
            {
                System.out.println(pd.getDisplayName());
                return pd.getName();
            }
        }
    }
    catch (IntrospectionException e) 
    {
        e.printStackTrace();
    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }


    return null;
}
于 2012-11-22T14:14:58.983 に答える
7

「get」または「is」プレフィックスを削除し、最初の文字を小文字にするだけでは十分ではありません。たとえば、getID の適切な Bean 名は ID であり、iD ではありません。

Bean 名を取得する最も簡単な方法は、get または is プレフィックスを削除してから、結果をIntrospector.decapitalizeに渡すことです。

これを行うために私が書いたメソッドは次のとおりです。

private String getBeanName(String methodName)
{
    // Assume the method starts with either get or is.
    return Introspector.decapitalize(methodName.substring(methodName.startsWith("is") ? 2 : 3));
}
于 2015-04-07T19:38:51.063 に答える
6

リフレクションを使用してコードが何をするかを調べることはできません。

getName()メソッドが呼び出されたフィールドを読み取り、name他に何もしないと想定できます。ただし、そうする必要はありません。たとえば、フィールド名はフィールドであるm_name場合も_nameあれnameFieldば、フィールドでない場合もあります。

于 2012-11-02T09:45:08.520 に答える
6

あなたはできる

Field[] declaredFields = A.class.getDeclaredFields();
        for(Field f:declaredFields){
            System.out.println(f.getName());
        }
于 2012-11-02T09:47:22.767 に答える
3

ロンボクの @FieldNameConstantsアノテーションを使用できます。

クラスに注釈を付けます。

import lombok.experimental.FieldNameConstants;
import lombok.AccessLevel;

@FieldNameConstants
public class FieldNameConstantsExample {
  private final String name;
  private final int rank;
}

バックグラウンドで次のコードを生成します。

public class FieldNameConstantsExample {
  private final String name;
  private final int rank;
  
  public static final class Fields {
    public static final String name = "name";
    public static final String rank = "rank";
  }
}

したがって、次の方法でプロパティ名にアクセスできます。

FieldNameConstantsExample.Fields.name

文字列です"name"

于 2021-06-25T15:00:20.093 に答える
1

BeanがJavaBeanの規則に従っている場合は、リフレクションを使用してすべての「get」および「is」メソッドを取得し、取得したメソッド名から「get」または「is」プレフィックスを削除すると、フィールド名が得られます。

アップデート

// Get the Class object associated with this class.
    MyClass myClass= new MyClass ();
    Class objClass= myClass.getClass();

    // Get the public methods associated with this class.
    Method[] methods = objClass.getMethods();
    for (Method method:methods)
    {
        String name=method.getName();
        if(name.startsWith("get") || name.startsWith("is"))
        {
           //...code to remove the prefixes
        }
    }
于 2012-11-02T09:45:01.403 に答える
1

リフレクション API を使用すると、以下のように POJO フィールドを取得できます。継承されたクラスは、ここで問題を見つける可能性があります。

TestClass testObject= new TestClass().getClass();
Fields[] fields = testObject.getFields();
for (Field field:fields)
{
    String name=field.getName();
    System.out.println(name);
}

または、Reflections API を使用して、クラス内のすべてのメソッドを取得し、それを反復処理して属性名を見つけることもできます (標準の POJO メソッドは get/is/set で始まります) ... このアプローチは、継承されたクラス構造で機能しました。

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

ただし、より興味深いアプローチを以下に示します。

Jackson ライブラリの助けを借りて、タイプ String/integer/double のすべてのクラス プロパティと、Map クラス内のそれぞれの値を見つけることができました。(すべてリフレクション API を使用せずに! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
于 2017-03-22T21:51:52.790 に答える
0

メソッドでアクセスする必要があります。現時点では、getter はメンバーを返しますnameが、これは将来変更される可能性があります。これをデータベースまたは Web サービスから遅延してインスタンス化したり、名/姓などから構築したりすることがnameできます。フィールドが存在しない可能性が非常に高くなります。

したがって、常にメソッドを実行します(リフレクションを介しても)

于 2012-11-02T09:47:12.237 に答える
0

メソッドの名前が分かっている場合は、「get」を削除して、次の文字を小文字に変換するだけでよいため、リフレクションは必要ありません。

getter メソッド (getName()) が「name」とは異なる名前のプロパティを返す場合、メソッドの名前からプロパティの名前を取得することはできません。

メソッドの名前がわからない場合は、リフレクションによってすべてのメソッドを取得でき、すべての名前のプロパティも取得できます。

于 2012-11-02T09:51:10.610 に答える
-3

以下を試してください

class A{

       private String name;
       private String salary;

   //getter and setter methods

       public void setName(String name){
          this.name = name;
        }

       public void setSalary(String salary){
           this.salary = salary;

         }

        public String getName(){
          return name;
          }

        public String getSalary(){
          return salary;
          }

}

getメソッドは、プログラム メソッドまたはデータベースから動的にデータを取得するために使用されます。値のプロパティではなく値のみを反映します。

于 2012-11-02T11:35:51.120 に答える