2013-02-18 8 views
5

私はGoogle Protobufメッセージを処理しています。Method.invoke()による静的メソッドの呼び出しにより、NPE

私の必要性は、オブジェクトのインスタンスフィールドを設定することです(それらのうちのいくつかはProtobuffメッセージです)。私はリフレクションによってビルダーを取得し、protobuf-java-formatによってメッセージを再作成する関数を作成しました。

はここ

for (String aFieldName : objectContentMap.keySet()) { 
Object aFieldNameValue = objectContentMap.get(aFieldName); 
if (aFieldNameValue != null) { 
    Field theClassField = this.instance.getField(aFieldName); 
    ReflectionUtils.makeAccessible(theClassField); 
    Class<?> classType = theClassField.getType(); 
    if (!classType.isPrimitive() && 
    GeneratedMessage.class.isAssignableFrom(classType.getSuperclass())) { 
    Method method = classType.getMethod("newBuilder"); 
    // Since the method is static, the instance object that undergoes the call is not important, but with "null" I have a NPE... 
    Object builder = method.invoke(new Object()); 
    if (builder instanceof Builder) { 
    Builder newBuilder = (Builder)builder; 
    InputStream asd = new ByteArrayInputStream(((String)aFieldNameValue).getBytes()); 
    protoMapper.merge(asd, newBuilder); 
    aFieldNameValue = newBuilder.build(); 
    } 
    } 
    theClassField.set(recreatedObject, aFieldNameValue); 
} 
} 

このコードは意図したとおりに動作するコードですが、私の疑問は、私は、私は常に実際のパラメータとしてnullを入れている静的メソッドを呼び出すとき以来Object builder = method.invoke(new Object());ラインです。

このシナリオでは、NullPointerExceptionが発生しました。

実際にinvoke()の実際のパラメータにインスタンスが必要な理由を知りましたか?

ありがとうDario。

+0

invokeがNPEをスローする場合、メソッドは静的ではありません。 Modifier.isStatic(method.getModifiers()) – Javier

+0

@Javier:既にメソッド修飾子をチェックしているかどうかを確認することができます。コントロールは私に不幸にも真実を与えました。 – Dario

+0

私の主な疑問はprotobuf部分にあります。私はこれらのgeneretedクラスであまり経験はありませんでした... – Dario

答えて

0

メソッドのjavadocは、Method.invokeメソッドのシグネチャは言う:
「基本となるメソッドがstaticの場合:
はまた言う
を "(、オブジェクトobjオブジェクト...引数)を呼び出します"指定されたobj引数は無視され、nullでもかまいません。

これは、基本的な方法が静的でないことを意味します。しかし、それが静的であるかどうかをチェックしていますが、それは正しくありません。

関連する問題