2009-05-21 16 views
11

Java Reflection ile ilgili olarak a question last night gönderdim ve bu sabah derleyici uyarılarını keşfediyorum.Java Yansıma Çağrılarını kontrol etmek için uygun yol?

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 

Bu döndürülen yöntemleri denetlemenin "uygun" bir yolu var mı? (Yani bu uyarıları kurtulmak için uygun bir yolu var mı?)

Kaynak kodu:

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

cevap

33

Değişim temelde demektir Yani

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

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

için, " Jenerik biliyorum, ama tür argüman hakkında hiçbir şey bilmiyorum. " Bunlar semantik olarak eşdeğerdir, ancak derleyici farkı söyleyebilir. Daha fazla bilgi için, bkz. relevant Java Generics FAQ entry ("Sınırsız joker örnekleme ve ham tür arasındaki fark nedir?").

+1

Geçerli JDK7 derleyicisinin, bu satırda bir rawtype uyarısı ve de değişkenin kullanıldığı kullanılmayan ertelenmiş uyarıyı vereceğine inanıyorum. –

+2

İlk versiyonda mı demek istiyorsun? Muhtemelen ikinci versiyon hala iyi. –

+0

Evet, geçerli JDK8 derleyicisi, "Class" ilk satırında bir "raw types" hatası veriyor, ancak ikinci satır olan "Class " ile mutlu. –

İlgili konular