代码之家  ›  专栏  ›  技术社区  ›  Andreas Dolk

基于类型签名创建类对象

  •  2
  • Andreas Dolk  · 技术社区  · 15 年前
    Class.forName(boolean.class.getName());
    

    这在Java中是不起作用的——虚拟机用一个CaseNojFutuxExpPress来给你打拍子。我需要这样的东西,因为我想基于包含方法签名的字符串反映方法,比如

    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> booleanClassObject = boolean.class;
    

    工作得很好,还有

    String name = boolean.class.getName();
    
    6 回复  |  直到 15 年前
        1
  •  1
  •   Bozho    15 年前

    也许你有一些 if S:

    if (type.equals("boolean")) {
        return boolean.class;
    } else if (type.equals("int")) {
        return int.class;
    } .. etc
    
        2
  •  1
  •   Kris    15 年前

    以下内容有效:

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

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

        3
  •  1
  •   bmargulies    15 年前

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

        4
  •  0
  •   navr    15 年前

    可以尝试使用布尔包装类而不是基元布尔类吗?

        5
  •  0
  •   giri    15 年前

    您使用的是BooLoin,它是Java中的一个原语。必须使用布尔值,即 包装机 在Java中的类。

        6
  •  0
  •   neverend    15 年前
    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();