6
java.lang.NoSuchFieldException: id

以下の行は例外を作成しています。

String fieldValue =String.valueOf(studyplanCategory.getClass().getField(filterProperty).get(studyplanCategory)); 

studyplanCategory は有効なオブジェクトであり、実際の値を取得しています。この例外のため、JSF Web アプリケーションの LazyLoading DataTable のロード メソッドと検索機能が機能していません。

4

4 に答える 4

20

JavadocからClass.getField(...)

この Class オブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリック メンバー フィールドを反映する Field オブジェクトを返します。name パラメータは、目的のフィールドの単純な名前を指定する文字列です。反映されるフィールドは、次のアルゴリズムによって決定されます。このオブジェクトが表すクラスを C とします。

C が指定された名前でパブリック フィールドを宣言する場合、それが反映されるフィールドです。上記のステップ 1 でフィールドが見つからなかった場合、このアルゴリズムが C の各直接スーパーインターフェースに再帰的に適用されます。直接スーパーインターフェースは、宣言された順序で検索されます。上記の手順 1 と 2 でフィールドが見つからず、C にスーパークラス S がある場合、このアルゴリズムは S に対して再帰的に呼び出されます。C にスーパークラスがない場合は、NoSuchFieldException がスローされます。Java 言語仕様のセクション 8.2 および 8.3 を参照してください。

次の方法で取得しようとしているフィールドの場合:

studyplanCategory.getClass().getField(filterProperty)

が非公開の場合は、NoSuchFieldException. プライベート フィールドの場合は、代わりにこれを試してください。

studyplanCategory.getClass().getDeclaredField(filterProperty)

そして、この方法でフィールドを介して値を設定するときに潜在的な不正なアクセス例外を回避するには:

Field field = studyplanCategory.getClass().getDeclaredField(filterProperty);
field.setAccessible(true);
field.get(studyplanCategory);
于 2012-04-25T12:44:01.747 に答える
9

アプリは、あなたが返したい属性を認識しないため、この例外を発生させます。メソッドgetField()は非プライベート属性を返すため、属性がプライベートの場合、メソッドはそれらを認識しません。http://docs.oracle.com/javase/tutorial/reflect/member/fieldTrouble.htmlを確認できます

だからあなたはあなたの属性が保護されたまたは公開された上で変化し、それからそれを正しく機能させるべきであるということをすることができます。しかし、この方法(primefacesの例と同じ)は、実際のデータベースをシミュレートします。

public List<Car> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
        List<Car> data = new ArrayList<Car>();  

        //filter  
        for(Car car : datasource) {  
            boolean match = true;  

            for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {  
                try {  
                    String filterProperty = it.next();  
                    String filterValue = filters.get(filterProperty);  
                    String fieldValue = String.valueOf(car.getClass().getField(filterProperty).get(car));  

...

したがって、このリストは、たとえば実際のデータベースのみをシミュレートします。使いたいなら。だからあなたはバッキングビーンクラスでそれをするべきですそしてそこでそれをします。すでに何らかのフィルターを使用して接続を開くか、開かないで、データベースからデータを返します。

//編集:男はgetDeclaredField()を使用する必要があると書いたが、私はこれを試したがうまく機能せず、IlegalAccessExceptionをスローした。プレタイプが保護に起因する場合、それは正常に機能します。どうしてか分かりません。

于 2012-04-25T12:45:39.983 に答える
1

問題の最善の解決策は次のgetClass().getField()とおりです。

getField ( ) の代わりにgetDeclaredField () を使用する

1)

String propertyName = "test";<br/>
Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

2)

String propertyName = "name";<br/>
Replace **"HelloWorld"** with your class name<br/>
HelloWorld.class.getDeclaredField(propertyName)
于 2014-05-07T07:56:03.270 に答える