0

はい、このトピックに関する記事がたくさんあることは知っていますが、それほど単純ではありません。

メソッドに引数を一般的に渡し、その後値を取得するために使用されるラッパークラスがあります。このラッパー クラス ( と呼ばれるIDVariant) には、格納されている変数の主な型を示す既定の型があります。

したがって、私は持つことができます:

IDVariant v = new IDVariant(1);
boolean b = v.booleanValue();
String s = v.stringValue();
int i = v.integerValue();

intなどですが、インスタンスの作成に使用されたパラメーターのタイプに従って、デフォルトのタイプは になります。

現在、このクラスは、前述のように、はるかに大きく複雑なクラスで一般的なプレースホルダーとして使用されています。クラスの上部構造を再帰的に解析し、この構造を XML で再作成するツールを作成する必要があります。明らかに、進むべき道はリフレクションであり、これまでのところ全体の構造を再現することに成功しています。唯一の問題は、IDVariant の既定の型を見つける方法が思いつかなかったので、XML ツリーの各変数の型が正しいことです。

私が試したことはget、各クラスの各プロパティのメソッドを取得し、それを呼び出して、各 IDVariant の既定の型を確認することです。良いアイデアのように思えましたが、うまくいきません:InvocationTargetExceptionメソッドを呼び出すために作成したクラスのインスタンスに、実際にはデータが入力されていないという事実が原因であると思われます。それは私が与えることができた唯一の論理的な説明です.

誰かが何か考えを持っているなら、私は最も感謝しています! :)

以下は、サンプル コード フラグメントです。

// Edit of the code, as correctly indicated by cyon. Tha variable className is given.
Class<?> toParse = Class.forName(className);
Object o = toParse.newInstance();   // There is a default constructor with no values, the object is not null

Class cl = ... // given class
Class[] noparams = {};

String s = "getSomeValue";
Method method = null;
for(Method m : cl.getMethods()) {
    if (m.getName().equals(s)) {
        method = m;
        break;
    }
}

if (method != null) {
    try {
        Object idv = method.invoke(o, noparams);  // exception occurs at this point
        String type = decodeType((IDVariant)idv); // function which maps internal codes of IDVariant default type to primitive and internal types
        return type;
    } catch (InvocationTargetException ex) {
        System.out.println(ex.getCause());
    }
}

注: 関数は実際に IDVariant 型の変数を返します。ソース コードを確認しました。ただし、そのコードは自動的に生成される外部ツールからのものであるため、変更できません。

前もって感謝します :)

編集:さて、外部ツールによって生成されたソースをよく見て、これが私が集めたものです:

私はサンプルメソッドを呼び出していますgetSomeValue. メソッドが宣言されているクラスのソースでは、メソッドの宣言は次のとおりです。

public IDVariant getSomeValue() { return GetPropDirect(externalValue); }

したがって、おそらくスーパークラスに属する別のメソッドを内部的に呼び出そうとしているので、スーパークラスをインスタンス化していません。これが問題である可能性はありますか?はいの場合、回避策はありますか?

編集 2: 要求に応じて、ここに私が取得している例外のスタック トレースがあります:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at prove.Reflector.getImplicitType(Reflector.java:275)
    at prove.Reflector.recurr(Reflector.java:134)
    at prove.Reflector.ParseToXml(Reflector.java:69)
    at prove.Main.main(Main.java:12)
Caused by: java.lang.NullPointerException
    at com.progamma.doc.IDDocument.GetPropDirect(IDDocument.java:739)
    at it.zerounoesse.Calcolo7302013.Contribuente.getSomeValue(Contribuente.java:70)
... 8 more
4

1 に答える 1

0

クラスIDVariantはもちろんインスタンス化されます。これはtoParse.newInstance()メソッドで行うことですが、インスタンス化されたオブジェクトを元のクラス型にキャストしてから初期化しないため、NullPointerEx などの例外が発生する可能性が高くなります。

于 2013-09-11T08:20:37.723 に答える