【问题标题】:casting in an object based on an incoming string根据传入的字符串强制转换对象
【发布时间】:2011-08-17 10:23:04
【问题描述】:

这可以用Java完成吗

public <T> T[] getAttr(String s) {
    Object x = getSomething(s);
    com.class."s"[] y = (com.class."s"[]) x;
    return y;
}

我意识到这一切都非常艰难。但是这个基本原理在Java中是可以实现的。

编辑:

伙计们,我已经有了想要返回的对象x。我只是希望它作为正确的类型返回。即s的class版本

【问题讨论】:

  • 不太确定您想要什么,但据我了解,您似乎需要反思。
  • 我想根据一个字符串参数来设置对象的类型。这可以做到吗。如果字符串有一个函数String.toClass,基本上是一个类似的函数
  • @adarshr 它是 Object,getSomething 方法返回 Object。为什么它是否是一个数组有什么关系我刚刚意识到我在equals右侧的转换中输入错误

标签: java class templates casting


【解决方案1】:

获取课程

Class<?> theClazz = Class.forName("com.class."+s);

创建一个指定运行时类型和长度的数组:

java.lang.reflect.Array.newInstance(theClazz, length);

您将不得不取消一些关于类型安全的警告。如果你真的想从 Strings 出发,那是没有办法的。或许可以传入一个 Class 对象,然后它可以是类型安全的。

【讨论】:

    【解决方案2】:

    这是非常类型不安全的做法:

    return (T[]) java.reflect.Array.newInstance( Class.forName( "com.class" + s, n );
    

    【讨论】:

      【解决方案3】:

      这是完全合法的

      public class Test {
          public static void main (String[] args) {
      
              Object o = new String("abc123");
      
              try {
                  String s = cast(o, "java.lang.String");
                  System.out.println(s);
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
          }
      
          public static <T> T cast(Object o, String clazz) throws ClassNotFoundException {
              return (T) Class.forName(clazz).cast(o);
          }
      }
      

      问题是,你会完成什么?真的没什么。当然,您可以基于字符串 (Class.cast(...)) 强制转换对象,但您仍然需要在编译时将输出声明为字符串。运行时类型和编译时类型之间的区别。而且java是强类型的。编译器不会尝试将您的字符串转换为类型,并且泛型是严格编译时的。

      【讨论】:

      • 好的,让我更详细地解释一下。我的方法getSomething 方法接受一个字符串,该字符串是一个属性名称,它调用正在自省的关联对象上的getter,并将值作为Object 这些对象的数组返回。为了能够对它们做一些有用的事情,我不仅需要将它们强制转换为数组,还需要将它们转换为类型。
      【解决方案4】:

      我认为这可以使用JAVA Reflection API 来实现,尽管我遇到了许多警告要小心使用它,因为它可能会导致难以预见的影响。

      【讨论】:

        猜你喜欢
        • 2016-03-20
        • 2011-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2021-10-24
        • 1970-01-01
        相关资源
        最近更新 更多