检查Java反射调用的正确方法是什么?

16

我昨晚发布了一个有关Java反射的问题a question last night,今天早上发现编译器警告。

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个回答

48

更改

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

这基本上意味着,“我知道它是泛型的,但我对类型参数一无所知。” 它们在语义上是等效的,但编译器可以区分它们。有关更多信息,请参见相关的Java Generics FAQ条目(“无限制通配符实例化和原始类型之间有什么区别?”)。


1
我相信当前的JDK7编译器会在那一行发出rawtypes警告,以及在使用变量时发出延迟未检查的警告。 - Tom Hawtin - tackline
2
你是指第一个版本吗?第二个版本应该还可以。 - Jon Skeet
是的,当前的JDK8编译器在第一行Class会给出“原始类型”错误提示,但对于第二行的Class<?>则没有问题。 - Soren Stoutner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接