Правильный способ проверить вызовы отражения Java? - PullRequest
14 голосов
/ 21 мая 2009

Я вчера вечером отправил вопрос о 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");
        }
    }
}

1 Ответ

39 голосов
/ 21 мая 2009

Изменение

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

до

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...