Подтвердить что ты не робот

Правильный способ проверки вызовов Java Reflection?

Я отправил вопрос вчера вечером о Java Reflection и сегодня обнаружил предупреждения компилятора.

C:\javasandbox\reflection>javac ReflectionTest.java
Note: ReflectionTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

C:\javasandbox\reflection>javac -Xlint:unchecked ReflectionTest.java
ReflectionTest.java:17: warning: [unchecked] unchecked call to
getDeclaredMethod(java.lang.String,java.lang.Class<?>...) as a member of the raw
type java.lang.Class

        myMethod = myTarget.getDeclaredMethod("getValue");
                                             ^
ReflectionTest.java:22: warning: [unchecked] unchecked call to
getDeclaredMethod(java.lang.String,java.lang.Class<?>...) as a member of the raw
type java.lang.Class

        myMethod = myTarget.getDeclaredMethod("setValue", params);
                                             ^
2 warnings

Есть ли "правильный" способ проверить эти возвращенные методы? (т.е. есть ли способ избавиться от этих предупреждений?)

Исходный код:

import java.lang.reflect.*;

class Target {
    String value;

    public Target() { this.value = new String("."); }
    public void setValue(String value) { this.value = value; }
    public String getValue() { return this.value; }
}

class ReflectionTest {
    public static void main(String args[]) {
        try {
            Class myTarget = Class.forName("Target");

            Method myMethod;
            myMethod = myTarget.getDeclaredMethod("getValue");
            System.out.println("Method Name: " + myMethod.toString());

            Class params[] = new Class[1];
            params[0] = String.class;
            myMethod = myTarget.getDeclaredMethod("setValue", params);
            System.out.println("Method Name: " + myMethod.toString());

        } catch (Exception e) {
            System.out.println("ERROR");
        }
    }
}
4b9b3361

Ответ 1

Изменить

Class myTarget = Class.forName("Target");

к

Class<?> myTarget = Class.forName("Target");

Это в основном означает: "Я знаю, что это общий, но я ничего не знаю о аргументе типа". Они семантически эквивалентны, но компилятор может сказать разницу. Для получения дополнительной информации см. соответствующий раздел часто задаваемых вопросов Java Generics ( "В чем разница между неограниченным экземпляром шаблона и необработанным типом?" ).