views:

316

answers:

1

I posted a question last night about Java Reflection and am discovering compiler warnings this morning.

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

Is there a "proper" way to check these returned methods? (i.e. Is there a proper way to get rid of these warnings?)

Source code:

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");
        }
    }
}
+6  A: 

Change

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

to

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

That basically means, "I know it's generic, but I know nothing about the type argument." They're semantically equivalent, but the compiler can tell the difference. For more information, see the relevant Java Generics FAQ entry ("What is the difference between the unbounded wildcard instantiation and the raw type?").

Jon Skeet
I believe the current JDK7 compiler will give a rawtypes warning on that line, as well as the deferred unchecked warning where the variable is used.
Tom Hawtin - tackline
Do you mean on the first version? Presumably the second version is still okay.
Jon Skeet