用于创建新对象的Java Reflection

时间:2015-12-05 23:56:31

标签: 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
  ....
}

1 个答案:

答案 0 :(得分:1)

我在这里看到的常见习语是使用Class.forName()

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

对于intchar,您必须使用各自类类型的名称,实际上无法创建基元。 “java.lang.Integer”,“java.lang.Character”等分别。如果你想传入“int”,“char”等,你需要特别检查这些。

将“值”添加为字符串要困难得多。大多数类都没有办法将字符串更改为初始状态。你肯定需要特殊情况下的基元来提供初始值。总的来说,我认为这不是解决您要解决的任何问题的好方法。

所以你在评论中提到使用setter方法。一个问题是你如何确定你打电话给哪个二传手?如果您为JButton传递参数“10”,那是setAlignmentXsetAlignmentY还是setText方法?

此时你必须全力以赴。

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

现在您遇到的问题是某些setter将其他类作为参数。有些类是不可变的(IntegerCharacter是),它们根本没有setter,你必须打电话给ctor。

你基本上是在这里进行序列化(这是一个非常难的问题)。看看XmlEncoderXmlDecoder,他们会做一些接近你想要的事情。 https://docs.oracle.com/javase/8/docs/api/java/beans/XMLEncoder.html