私は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。
invokeがNPEをスローする場合、メソッドは静的ではありません。 Modifier.isStatic(method.getModifiers()) – Javier
@Javier:既にメソッド修飾子をチェックしているかどうかを確認することができます。コントロールは私に不幸にも真実を与えました。 – Dario
私の主な疑問はprotobuf部分にあります。私はこれらのgeneretedクラスであまり経験はありませんでした... – Dario