1

現在のクラスに、その型が Integer であるか、そのジェネリック型が Integer であるパラメーターを持つメソッドがあるかどうかを確認する必要があります。

主に以下を書きました。

public static main(String[] args){
   Class<?> clazz = Class.forName("Test");
   Class<?> lookingForClass = Integer.class;
   Method[] method = clazz.getMethods();
   for (int i = 0; i < method.length; i++) {
       Type[] types = method[i].getGenericParameterTypes();
       for (int j = 0; j < types.length; j++) {
           Type type = types[j];
           Class<?> result = type.getClass();
           if (type instanceof ParameterizedType) {
               ParameterizedType pt = (ParameterizedType) type;
               Type[] fieldArgTypes = pt.getActualTypeArguments();
               result = (Class<?>) fieldArgTypes[0];
           }
           if (result instanceof lookingForClass)
               System.out.println("found it");
           }
      }
}

public static void findTowInArray(List<Integer> A) {

}

public static void findTowInArray(Integer A) {

}

public static void findTowInArray(String A) {

}

ただし、コンパイルエラーが発生しますif (result instanceof lookingForClass)

Incompatible conditional operand types Class<capture#6-of ?> and lookingForClass

なにが問題ですか?

4

4 に答える 4

1

Type がすでにクラスである場合は、getClass() を呼び出さないでください。

public static void main(String[] args) throws ClassNotFoundException{
    Class<?> clazz = Class.forName("Test");
    Class<?> lookingForClass = Integer.class;
    Method[] methods = clazz.getMethods();
    for (int i = 0; i < methods.length; i++) {
        Method method = methods[i];
        Type[] types = method.getGenericParameterTypes();
        for (int j = 0; j < types.length; j++) {
            Type type = types[j];
            Class<?> result = type instanceof Class<?> ? (Class<?>)type : type.getClass();
            if (type instanceof ParameterizedType) {
                ParameterizedType pt = (ParameterizedType) type;
                Type[] fieldArgTypes = pt.getActualTypeArguments();
                result = (Class<?>) fieldArgTypes[0];
            }
            if (result.equals(lookingForClass))
                System.out.println("found " + method);
            }
       }
 }

そして、私は次のようなループを好むでしょう

for (final Method method : methods) {
    ...
}

インデックスが必要ない場合。

于 2013-06-10T11:18:38.263 に答える
0

Type Erasureのため、型を取得できません。Javaコンパイラは、「型パラメータが制限されていない場合、ジェネリック型のすべての型パラメータをそれらの境界またはオブジェクトに置き換えます」。例えば:

public class Test<T> {
    public void setT(T t) {}
}

にコンパイルします

public class Test {
    public void setT(Object t) {}
}

したがって、実行時に型情報を取得することはできません。関連する質問も参照してください: Java のスーパークラスのコンストラクターで拡張ジェネリック クラスのジェネリック型を取得しますか?

于 2013-06-10T11:25:03.877 に答える
0

以下のコードを使用してみてください。型と Integer.class を比較する必要があります。

public static void main(String[] args) throws ClassNotFoundException
    {
        Class<?> clazz = Class.forName("Test");
        Class<Integer> lookingForClass = Integer.class;
        Method[] method = clazz.getMethods();
        for (int i = 0; i < method.length; i++)
        {
            Type[] types = method[i].getParameterTypes();

            for (int j = 0; j < types.length; j++)
            {
                Type type = types[j];
                Class<?> result = type.getClass();
                if (type instanceof ParameterizedType)
                {
                    ParameterizedType pt = (ParameterizedType) type;
                    Type[] fieldArgTypes = pt.getActualTypeArguments();
                    result = (Class<?>) fieldArgTypes[0];
                }
                if (type ==  lookingForClass)
                    System.out.println("found it");
            }
        }
    }
于 2013-06-10T10:47:08.947 に答える
0

上記のすべてのコメントを収集すると、解決策は次のようになります。

if (lookingForClass.isAssignableFrom(result) || type.equals(lookingForClass))
    System.out.println("found it");

そしてそうではない

if (result instanceof lookingForClass)
于 2013-06-10T11:00:45.887 に答える