2009-05-21 12 views
11

Ich postete a question last night über Java Reflection und entdecke Compilerwarnungen heute Morgen.Richtiger Weg, Java Reflection Calls zu überprüfen?

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 

Gibt es einen "richtigen" Weg, diese zurückgegebenen Methoden zu überprüfen? (Dh Gibt es eine richtige Art und Weise dieser Warnungen loswerden?)

Quellcode:

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"); 
     } 
    } 
} 

Antwort

33

ändern

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

zu

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

Das bedeutet im Grunde " Ich weiß, dass es generisch ist, aber ich weiß nichts über das Argument des Typs. " Sie sind semantisch gleichwertig, aber der Compiler kann den Unterschied erkennen. Weitere Informationen finden Sie unter relevant Java Generics FAQ entry ("Was ist der Unterschied zwischen der unbegrenzten Platzhalterinstanz und dem unformatierten Typ?").

+1

Ich glaube, der aktuelle JDK7-Compiler wird eine Rawtypes-Warnung in dieser Zeile sowie die verzögerte ungeprüfte Warnung, wo die Variable verwendet wird. –

+2

Meinst du auf die erste Version? Vermutlich ist die zweite Version noch in Ordnung. –

+0

Ja, der aktuelle JDK8-Compiler gibt einen 'rohen Typen'-Fehler in der ersten Zeile' Class', ist aber glücklich mit der zweiten Zeile 'Class '. –

Verwandte Themen