6

私のプログラムでは、クラスとプリミティブ型を扱います。プログラムがクラスを見つけた場合、次の呼び出しのいずれかを実行します。

  • Class.forName(classname)
  • cc.toClass()ccのインスタンスはどこですかCtClass

ただし、プリミティブ型が見つかった場合、事態はさらに悪化します。

  • Class.forNameは使用できません。プリミティブ型では使用できません。
  • cc.toClass()戻り値null

プリミティブ型のラッパー クラスからフィールドを呼び出すことはTYPE可能ですが、リフレクションでどのように行うことができますか?

これが私のコードです:

CtClass cc;//Obtained from caller code
Class<?> classParam;
if (cc.isprimitive()) {
    classParam= ?? // How can I get TYPE field value with reflection ?
} else {
    String nomClasseParam = cc.getName();

    if (nomClasseParam.startsWith("java")) {
        classeParam = Class.forName(nomClasseParam);
    } else {
        classeParam = cc.toClass();
    }
 }

Javassist 3.12.0.GA

編集:以下のアンサーで選択したソリューションを 投稿しました。とにかく、トムの答えにチェックを入れました。

4

3 に答える 3

5

ccサブクラスCtPrimitiveTypeにキャストできるように見えます。

ラッパーが必要な場合は、メソッドgetWrapperNameを使用して適切なラッパーのクラス名を取得できます。通常どおりClass.forNameを使用して、その名前をClassオブジェクトに変換できます。ただし、ラッパーが必要だとは思わないので、これは役に立ちません。

代わりに、 getDescriptorの後に、面倒な手作業でコード化された switch ステートメントが必要だと思います。

switch(descriptor) {
    case 'I': classParam = int.class; break;
    // etc
}

そのようなものは本当に Javassist にあるはずです。しかし、私が見る限り、そうではありません。

于 2011-09-12T13:13:13.113 に答える
3

トムとモモからの回答に基づいて、私が思いついた解決策は次のとおりです。

CtClass cc; //Obtained from caller code
Class<?> classParam;

if (cc.isprimitive()) {
    classParam = Class.forName(((CtPrimitiveType)cc).getWrapperName());
    classParam = (Class<?>)classParam.getDeclaredField("TYPE").get( classParam );
} else {
    String nomClasseParam = cc.getName();

    if (nomClasseParam.startsWith("java")) {
        classeParam = Class.forName(nomClasseParam);
    } else {
        classeParam = cc.toClass();
    }
 }

メソッドを呼び出しCtPrimitiveType#getWrapperNameてから、TYPE フィールドを使用してプリミティブ型クラスを取得します。また、switch ステートメントを書くことも避けます。

助けてくれてありがとう。

于 2011-09-12T14:00:54.870 に答える
1

プリミティブのオブジェクト ラッパーの Class.forName を実行できます (たとえば、プリミティブ int の Integer)。Java はオートボクシングをサポートしているため、オブジェクト ラッパーと対応するプリミティブを交換できます。

JavaAssist のCtClassを使用していると仮定しています。がプリミティブの場合、(確認が必要)ccのタイプになると思います。CtPrimitiveTypeこの場合、キャストしてgetWrapperName()を呼び出してラッパー クラスを取得できます。

于 2011-09-12T13:06:02.497 に答える