2009-05-21 10 views
11

Ho postato a question last night su Java Reflection e sto scoprendo gli avvisi del compilatore questa mattina.Modo corretto per controllare le chiamate Reflection Java?

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 

Esiste un modo "corretto" per controllare questi metodi restituiti? (Cioè Esiste un modo corretto di sbarazzarsi di questi avvertimenti?) Codice

Fonte:

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

risposta

33

Change

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

a

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

Ciò significa in sostanza, " So che è generico, ma non so nulla dell'argomento tipo ". Sono semanticamente equivalenti, ma il compilatore può dire la differenza. Per ulteriori informazioni, vedere relevant Java Generics FAQ entry ("Qual è la differenza tra l'istanziazione con jolly illimitata e il tipo non elaborato?").

+1

Credo che l'attuale compilatore JDK7 fornirà un avviso di tipo rawtypes su quella riga, nonché il messaggio di avviso non controllato differito in cui viene utilizzata la variabile. –

+2

Vuoi dire sulla prima versione? Presumibilmente la seconda versione è ancora a posto. –

+0

Sì, il compilatore JDK8 corrente restituisce un errore 'raw types 'nella prima riga' Class', ma è soddisfatto della seconda riga 'Classe '. –

Problemi correlati