用于创建新对象的 Java 反射

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

最佳答案

我在这里看到的常见习惯用法是使用 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 将其他类作为参数。有些类是不可变的( IntegerCharacter 是),它们根本没有 setter,你必须调用 ctor。

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

关于用于创建新对象的 Java 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34112365/

相关文章:

java - 通知播放默认声音而不是安装的声音

java - 错误 :Execution failed for task ':app:transformClassesWithFirebasePerformancePluginForRelease'

java 使用Executor实现多线程

c# - 通用静态类 - 在运行时检索对象类型

c# - "static reflection"在 Java 中如何工作? (例如在 mockito 或 easymock 中)

c# - 比较反射中的基类型

java - 使用 Zookeeper 和 Thrift 负载均衡服务

java - 输入不匹配异常是什么意思?

C++ 唯一类名与命名空间

c++ - 我如何漂亮地打印一个结构,其字段被命名?