2009-05-21 12 views
19

Próbuję zrozumieć Java reflecton i napotykam trudności podczas pracy z metodami ustawiającymi nie-Integer.Java Reflection getDeclaredMethod() z typami klas

Jako przykład, w jaki sposób mogę rozwiązać poniższe żądanie "getDeclaredMethod()"?

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"); // Works! 
      System.out.println("Method Name: " + myMethod.toString()); 

      Class params[] = new Class[1]; 
      //params[0] = String.TYPE; // ?? What is the appropriate Class TYPE? 
      myMethod = myTarget.getDeclaredMethod("setValue", params); // ? Help ? 
      System.out.println("Method Name: " + myMethod.toString()); 

     } catch (Exception e) { 
      System.out.println("ERROR"); 
     } 
    } 
} 
+0

Jedno pytanie mam dla ciebie, w jakim scenariuszu postaram się dowiedzieć, które metody są w klasie i zmiennych? dlaczego spróbuję to wiedzieć? Zajmuję się przyczynami korzystania z tej metody getDeclaredMethod(), getDeclaredFields(), etc ... Czy możesz zasugerować – gmhk

+0

Jednym (przypadkowym) powodem używania refleksji jest, jeśli chcesz zbudować bibliotekę serializacji/deserializacji Json. Dobrze znana biblioteka Google Gson intensywnie wykorzystuje refleksje do realizacji swoich zadań. Przykłady takich zastosowań mogą trwać wiecznie. Można na przykład zbudować protokół sieciowy, którego można użyć do serializowania i przesyłania różnych właściwości obiektów Java do innej aplikacji lub do serwera opartego na innym języku, co pozwala zaoszczędzić ogromną ilość czasu na niezastosowanie metody serializacji dla wszystkich klas, które chcesz Wymieniać się. –

Odpowiedz

20
params[0] = String.class; 

Korzystanie class na String zwróci Class<?>, który jest skojarzony z klasą String.

+4

Ugh. Jestem idiotą. Dzięki! – Nate

+1

(Ups, nie chciałem głosić komentarza!) Chciałem tylko dodać, że nie byłem tego świadomy do pewnego dnia, więc nie jest to aż tak oczywiste. – coobird

+0

Jedno pytanie mam dla ciebie, w jakim scenariuszu postaram się dowiedzieć, które metody są w klasie i zmiennych? dlaczego spróbuję to wiedzieć? Zajmuję się przyczynami używania tej metody getDeclaredMethod(), getDeclaredFields(), etc ... Czy możesz sugerować – gmhk