【问题标题】:Class.forName castsClass.forName 强制转换
【发布时间】:2011-10-12 02:17:51
【问题描述】:

在 Java 中,将在转换中使用 Class.forName 会导致对象被转换为类或被转换为找到的转换。例如,如果你这样做了

Object a;
String b = "testing";
a = (Class.forName("java.lang.Object")) b;

a 是 Class 的实例还是 Object 的实例?

【问题讨论】:

  • 我已经回答了您实际提出的问题,但我怀疑您有一个潜在的不同问题;像这样的问题通常是由某人试图解决的潜在问题引起的,但走错了路。我建议发布一个(单独的)问题来询问潜在的问题,人们可能会告诉你如何到达那里。
  • 两者都不是:该代码无法编译,因此无法执行...

标签: java class reflection casting


【解决方案1】:

Class.forName 返回一个 Class 实例。我相当确定您引用的代码无法编译,您正在尝试将函数调用用作强制转换。


更新:刚刚想到:如果您要问如何在演员表中使用动态加载的类,您基本上不能。铸造(主要)是编译时的事情。让动态加载的类实现一个接口,您可以将其编译到代码中然后强制转换为该接口,或者如果您不能这样做,请使用 reflection 访问动态加载的类的成员。

【讨论】:

    【解决方案2】:

    您可以使用类对象的.cast 方法进行转换:

    Object a;
    String b = "testing";
    a = Class.forName("java.lang.Object").cast(b);
    

    但是您似乎对强制转换有错误的想法 - 在 Java 中,强制转换不会更改任何对象,它只是告诉编译器该对象是某种类型,并且在运行时,VM 会测试是否确实如此(如果编译器还不能证明它)。如果你“作弊”,VM 会在这里抛出一个ClassCastException(它不会转换你的对象)。

    (如果涉及原始类型,它的工作方式会有所不同。)

    Class 对象的cast 方法是同一机制的通用变体。由于它具有返回类型T(来自Class<T>),这允许泛型代码将未知对象转换为某个类类型,其中该类对象对应于类型变量。 这在这里对你没有帮助——Class.forName的返回类型是Class<?>,这意味着它的cast方法只能返回Object

    无论如何,转换为 java.lang.Object 没有任何效果(它总是会成功),除了向编译器隐藏该值具有某种特殊类型。 (如果你有重载的方法,这可能很重要。)

    简单写

    Object a;
    String b = "testing";
    a = b;
    

    这里有同样的效果。

    【讨论】:

      【解决方案3】:

      如果需要强制转换实例,这是一种方法

      String className         = "YourClass";
      Class someClass          = Class.forName( className );
      Constructor constructor  = (Constructor) someClass.getConstructor();
      Object someInstance      = constructor.newInstance();
      
      // now you can cast as allways.
      (YourClass) (someInstance)
      

      【讨论】:

        【解决方案4】:

        Class.forName 总是返回 Class

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-28
          • 2012-02-10
          • 2012-12-04
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          • 2021-01-24
          • 1970-01-01
          相关资源
          最近更新 更多