根据类型签名创建Class对象

时间:2010-03-17 11:00:57

标签: java

Class.forName(boolean.class.getName());

这在Java中不起作用 - 虚拟机会使用ClassNotFoundException。我需要这样的东西因为我想反映基于字符串的方法,包括方法签名,比如

public void doSomething(boolean yesWeCan, java.lang.String[] presidents);

最后,我想出了一个自定义的'ClassFactory',它将字符串类型转换为类对象。这个工厂包括许多原始和数组类型值的处理程序。

数组类型对象的处理程序类似于:

if (isArrayOfObjects) {
   return Class.forName("L["+typeName.replace("[]", "")+";");
}

我的问题是 - 我是否遗漏了Java 1.5+ API中的某些内容?

修改

感谢您的回答,Class.forName与包装类的效果相当不足为奇。但我正在寻找所有java类型的解决方案,包括数组和基元。因此我的第一行不是拼写错误。一些方法签名确实有java原语作为参数,我不能只使用包装类来反映库中的方法,我真的需要该类型的Class对象(如boolean)。

Class<boolean> booleanClassObject = boolean.class;

工作正常,以及

String name = boolean.class.getName();

6 个答案:

答案 0 :(得分:1)

以下内容可行:

Class.forName(Boolean.class.getName());

自动(联合)装箱应该处理到实际原语的转换。虽然没有看到更多的代码,但我无法确定这是否能解决您的问题。

答案 1 :(得分:1)

实际创建数组可能更容易,然后请求它的.class。这就是我过去所做的。

答案 2 :(得分:1)

也许你有一些if s:

if (type.equals("boolean")) {
    return boolean.class;
} else if (type.equals("int")) {
    return int.class;
} .. etc

答案 3 :(得分:0)

您可以尝试使用布尔包装类而不是原始布尔值吗?

答案 4 :(得分:0)

您正在使用boolean,这是java中的原语。您必须在java中使用 wrappaer 类的布尔值。

答案 5 :(得分:0)

primitive type is a object and  not a class.  it can't getClassLoader and  getClassName.
the below expression will be wrong.
boolean a = new boolean();