2017-12-21 71 views
1

Javaでクラスのget/setメソッドを呼び出すときにクラス属性名を取得することができれば誰でも私を明確にしてもらえますか?
オンラインでリフレクションコンセプトを使用してクラス属性名を取得できることがわかりました。Java - getメソッドが呼び出されたときにクラス属性名を取得

マイ状況:
は、属性値が空/ nullである場合には、空のヌル/の属性の値をチェックする方法を記述し、属性名を返すようにしようとしています。

例:

クラス:

public class MyClass { 
    private appName; 

    public void setAppName(String appName) { 
    this.appName = appName; 
    } 

    public String getAppName() { 
    return this.appName; 
    } 
} 

検証方法:

public String validateForNull(MyClass myclass) { 
    String name = myclass.getAppName(); 
    if(name == null || name.isEmpty()) { 
    return //here I want to return attributeName which will be "appName" 
    } 
} 

属性名を表す定数文字列を返すことが、このアプローチの方がはるかに簡単できちんとした方法であることに気付きました。しかし、私はそれがバリデーションメソッドがクラスオブジェクトを取り、ヌル/空のすべての/指定された属性をチェックし、ヌル/空の値の場合は属性名を返す一般的な方法として、それを行うことができるかどうか疑問に思っていました。

ありがとうございます。

+0

それは正確に何をしたい私には特に明確ではないのですが、私は何かを理解すれば、これは([ビーン検証]のいくつかの並べ替えのように聞こえますhttp://beanvalidation.org/2.0/spec/)ケース。私が正しいとすれば、Bean検証APIを直接使用するか、実装の1つでアイデアを探すことができます。 –

答えて

1

getterまたはsetterを呼び出す属性の名前を取得できません。

ただし、呼び出すメソッドが単純な属性を設定または返すという保証はありません。

あなたが正しいです、あなたは、反射によって、与えられたオブジェクトの属性の値を得ることができます。

public String validateForNull(MyClass myclass) throws IllegalArgumentException, IllegalAccessException { 
     // Get the attributes of the class 
     Field[] fs = myclass.getClass().getFields(); 
     for(Field f : fs) { 
      // make the attribute accessible if it's a private one 
      f.setAccessible(true); 

      // Get the value of the attibute of the instance received as parameter 
      Object value = f.get(myclass); 
      if(value == null) { 
       return f.getName(); 
      } 
     } 
     return null; 
    } 

私はあなたがいくつかの種類の属性を持つことができ、それぞれのタイプには、特定の検証を持っているだろうと想像しているため、このような何かを行うことは、単にif(value == null)よりも、より完全なテストが必要になります。

あなたが検証する属性と使用を識別するために、アノテーションを使用することができ、このように行くことにした場合:あなたの注釈が属性に存在しているかどうかを確認し、これだけで必要なフィールドを検証するには

Annotation[] ans = f.getAnnotations(); 

0

反射を避けるのが最善です。代わりに、自動的に名前を見つけ、引数として渡ししようとしているの:

public String validateForNull(String attributeValue, 
           String attributeName) { 

    if (attributeValue == null || attributeValue.isEmpty()) { 
     return attributeName; 
    } 
    return null; 
} 

// ... 

String emptyAttribute = 
    validateForNull(myclass.getAppName(), "appName"); 
関連する問題