2009-05-21 3 views
19

Я пытаюсь понять рефлектометр Java и сталкиваюсь с трудностями при работе с неточечными методами setter.Java Reflection getDeclaredMethod() с типами классов

В качестве примера, как я могу решить вызов «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

Один вопрос У меня есть для вас, в каком сценарии я попытаюсь узнать, какие методы находятся в классе и переменных? почему я попытаюсь это узнать? Я изучаю причины использования этих методов getDeclaredMethod(), getDeclaredFields() и т. Д. Можете ли вы предложить – gmhk

+0

Одна (случайная) причина использования отражения - это если вы хотите построить библиотеку сериализации/десериализации Json. Хорошо известная библиотека Google Gson сильно использует отражения для достижения своих задач. Примеры таких обычаев могут продолжаться вечно. Например, вы можете построить сетевой протокол, который вы можете использовать для сериализации и отправки различных свойств объектов Java в другое приложение или на сервер на другом языке, что позволяет сэкономить огромное количество времени, чтобы не реализовывать метод сериализации для всех классов, которые вы хотите обмен. –

ответ

20
params[0] = String.class; 

Использование class на String возвращает Class<?>, связанный с String класса.

+4

Ugh. Я идиот. Благодаря! – Nate

+1

(Упс, я не хотел повышать комментарий!) Я просто хотел добавить, что я не знал об этом на днях, так что это не совсем так очевидно. – coobird

+0

Один вопрос. У меня для вас, в каком сценарии, я попытаюсь узнать, какие методы находятся в классе и переменных? почему я попытаюсь это узнать? Я изучаю причины использования этих методов getDeclaredMethod(), getDeclaredFields() и т. Д. Можете ли вы предложить – gmhk

Смежные вопросы