有没有办法使用 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
....
}
最佳答案
我在这里看到的常见习惯用法是使用 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 方法。一个问题是如何确定调用哪个 setter?如果传递参数“10”,则为JButton
,就是setAlignmentX
, setAlignmentY
,或 setText
方法?
此时你必须全力以赴。
<class>
<name>javax.swing.JButton</name>
<set><method>setAlignmentX</method><value>10</value></set>
</class>
现在你遇到了一些问题,一些 setter 将其他类作为参数。有些类是不可变的( Integer
和 Character
是),它们根本没有 setter,你必须调用 ctor。
您基本上在这里进入了序列化(这是一个非常困难的问题)。看看XmlEncoder
和XmlDecoder
,他们做的事情接近你想要的。 https://docs.oracle.com/javase/8/docs/api/java/beans/XMLEncoder.html
关于用于创建新对象的 Java 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112365/