2015-12-05 4 views
0

Есть ли способ создания примитивных переменных типа данных использовать Java Reflection?Java Reflection для создания новых объектов

Например,

public Object createObj(String type, String value){ 
    if(type.compareTo("char") == 0) 
    //return a char 
    else if(type.compareTo("int") == 0) 
    //return an int 
    .... 
} 
+2

err, 'return 'c';' and such? Зачем размышлять? – zapl

+0

Причина в том, что мы знаем только тип и значение во время выполнения, я думал, что размышление здесь может быть полезным. – firefly

+0

Нет, код на следующей строке после 'if (type.compareTo (" char ") == 0)' знает тип во время компиляции. Это 'char' или фактически' Character', когда вы возвращаете это завернутое как объект. – zapl

ответ

1

Распространенное идиома Я вижу здесь использовать Class.forName().

public static Object makeNew(String type) throws Exception { 
    Class clazz = Class.forName(type); 
    return clazz.newInstance(); 
} 

Для int, char вы должны использовать имена своих классовых типов, вы не можете на самом деле сделать примитивный. «java.lang.Integer», «java.lang.Character» и т. д., соответственно. Вам нужно будет проверить их специально, если вы хотите передать «int», «char» и т. Д.

Добавление «значения» в виде строки намного сложнее. У большинства классов не будет способа изменить строку в начальное состояние. Вы обязательно должны использовать особый случай, чтобы примитивы обеспечивали начальное значение. В целом, я думаю, что это не отличный способ подойти к любой проблеме, которую вы связываете, чтобы решить.


Так вы упомянули в своем комментарии об использовании методов setter. Одна из проблем заключается в том, как вы определяете, какой сеттер вы вызываете? Если вы передаете параметр «10», для JButton, это то, что setAlignmentX, setAlignmentY или метод setText?

На этом этапе вы должны пройти целую свиньи на нем.

<class> 
    <name>javax.swing.JButton</name> 
    <set><method>setAlignmentX</method><value>10</value></set> 
</class> 

У вас возникла проблема в том, что некоторые сеттеры используют другие классы в качестве параметров. И некоторые классы неизменяемы (Integer и Character), у них нет сеттеров вообще, вам нужно будет позвонить в ctor.

Вы в основном попадаете в сериализацию здесь (это очень трудная проблема). Взгляните на XmlEncoder и XmlDecoder, они делают что-то близкое к тому, что вы хотите. https://docs.oracle.com/javase/8/docs/api/java/beans/XMLEncoder.html

+0

Спасибо за помощь. Я пытаюсь избежать обычной проверки if-statement здесь. Итак, в основном я хочу, чтобы общий тип возвращаемого сигнала и отражение были тем, с чем я столкнулся. – firefly

+0

Предполагая, что у нас есть класс с частными членами 'char',' int', 'String',' long', а программа использует отражение для установки этих элементов данных путем динамического вызова их методов setter. Я думал, может быть, общий тип аргумента setter - хорошая идея? – firefly

+0

Если у вас есть класс с x, y и z, и все они типа 'double', откуда вы знаете, какой параметр идет с каким сеттером? Это довольно большая банка червей. – markspace

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