2009-05-21 6 views
11

J'ai posté a question last night sur la réflexion Java et je découvre les avertissements du compilateur ce matin.Un bon moyen de vérifier les appels 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 

Existe-t-il un moyen «correct» de vérifier ces méthodes retournées? (C.-à-t-il un bonne façon de se débarrasser de ces mises en garde?)

code source:

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

Répondre

33

changement

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

à

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

Cela signifie essentiellement, " Je sais que c'est générique, mais je ne sais rien de l'argument du type. " Ils sont sémantiquement équivalents, mais le compilateur peut faire la différence. Pour plus d'informations, voir le relevant Java Generics FAQ entry ("Quelle est la différence entre l'instanciation générique non bornée et le type brut?").

+1

Je crois que le compilateur JDK7 actuel donnera un avertissement rawtypes sur cette ligne, ainsi que l'avertissement non contrôlé différé où la variable est utilisée. –

+2

Voulez-vous dire sur la première version? Vraisemblablement, la deuxième version est toujours correcte. –

+0

Oui, le compilateur JDK8 actuel donne une erreur 'raw types' sur la première ligne' Class', mais est satisfait de la deuxième ligne 'Class '. –

Questions connexes