2

いくつかのstatic final Stringフィールドがあり、リフレクションを使用してそれらの値を取得したいので、次のようなメソッドを作成しました。

public String getLogoSrc(final String provider) {
    if (provider.equals(StringUtils.EMPTY)) {
        return StringUtils.EMPTY;
    }

    logger.info("---provider is: "+provider);

    for (Field f : ConstantsBean.class.getDeclaredFields()) {
        f.setAccessible(true);
        if (f.getName().contains(provider.toUpperCase().replace(" ", "_"))) {
            try {
                return f.get(null) != null?  f.get(null).toString() : "";
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    return StringUtils.EMPTY;
}

値を返そうとすると、常に NPE を受け取る理由がわかりません。

return f.get(null) != null? f.get(null).toString() : "";

例外は次のとおりです。

    java.lang.NullPointerException
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl
.java:36)
        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccess
orImpl.java:18)
        at java.lang.reflect.Field.get(Field.java:358)
        at com.gravitant.cloud.common.jsf.core.beans.ConstantsBean.getLogoSrc(Co
nstantsBean.java:195)

どんな手掛かり?

4

4 に答える 4

5

アクセスする前にフィールドを印刷します。非静的フィールドにアクセスしようとしていると思われるため、 null を渡すfield.get()ことは受け入れられません。

于 2012-11-01T11:12:26.173 に答える
3

こちらをご覧ください

get(Object obj)

指定された obj 引数が null の場合、メソッドは NullPointerException をスローします。

于 2012-11-01T11:12:46.483 に答える
2

指定されたオブジェクトとして null を渡しています。つまり、あなたはこれをやっています:

null.fieldname

フィールドが必要なオブジェクトへの参照を渡す必要があります。そのフィールド オブジェクトは、特定のオブジェクトのフィールドではなく、一般的なフィールドを表します。

同じことがリフレクションを介したメソッドにも当てはまります。メソッドを適用するオブジェクトの参照を渡す必要があります。

于 2012-11-01T11:13:03.997 に答える
0

field.get(obj) を呼び出すとき

パラメータ: obj - 表現されたフィールドの値が抽出されるオブジェクト

戻り値: オブジェクト obj で表されるフィールドの値。プリミティブ値は、返される前に適切なオブジェクトにラップされます

スロー: IllegalAccessException - 基になるフィールドにアクセスできない場合。

IllegalArgumentException- 指定されたオブジェクトが、基になるフィールド (またはそのサブクラスまたは実装者) を宣言するクラスまたはインターフェイスのインスタンスではない場合。

NullPointerException- 指定されたオブジェクトが null で、フィールドがインスタンス フィールドの場合。

ExceptionInInitializerError- このメソッドによって引き起こされた初期化が失敗した場合。

于 2012-11-01T11:14:31.610 に答える