【问题标题】:Dynamically converting java object of Object class to a given class when class name is known当类名已知时,将 Object 类的 java 对象动态转换为给定的类
【发布时间】:2010-12-25 23:41:28
【问题描述】:

是的,我知道。问题的长标题......所以我有字符串中的类名。我正在以这种方式动态创建该类的对象:

String className = "com.package.MyClass";   
Class c = Class.forName(className);
Object obj = c.newInstance();

如何将 obj 动态转换为 MyClass 对象?我不能这样写:

MyClass mobj = (MyClass)obj;

...因为 className 可以不同。

【问题讨论】:

  • 该代码不会转换:它会进行类型转换。是这个意思吗?

标签: java class object type-conversion


【解决方案1】:

如果要将对象(ob1)强制转换为类(classA),可以使用以下代码。

classA instance = (classA) ob1;

【讨论】:

    【解决方案2】:

    您不必将对象转换为 MyClass 对象,因为它已经是。您真正想要做的是强制转换它,但是由于在编译时不知道类名,因此您不能这样做,因为您不能声明该类的变量。我的猜测是你想要/需要像“鸭子打字”这样的东西,即你不知道类名,但你在编译时知道方法名。 Gregory 提出的接口是您最好的选择。

    【讨论】:

    • 如果你真的需要这种特性,可以考虑另一种语言——groovy 是一种在 jvm 上运行但具有你想要的特性的语言。
    【解决方案3】:
    @SuppressWarnings("unchecked")
    private static <T extends Object> T cast(Object obj) {
        return (T) obj;
    }
    

    【讨论】:

      【解决方案4】:

      你没有,声明一个接口来声明你想调用的方法:

      public interface MyInterface
      {
        void doStuff();
      }
      
      public class MyClass implements MyInterface
      {
        public void doStuff()
        {
          System.Console.Writeln("done!");
        }
      }
      

      然后你使用

      MyInterface mobj = (myInterface)obj;
      mobj.doStuff();
      

      如果MyClass不在你的控制之下,那么你不能让它实现一些接口,另一个选择是依赖反射(see this tutorial)。

      【讨论】:

      • 虽然我在大多数情况下都同意格雷格的观点;我发现自己处于不想了解接口的情况。我不知道上面的教程是否解决了这个问题,但我在研究这个问题时发现的那些都没有。这是我提出的动态解决方案(您需要知道方法/字段的名称以及类的名称):forums.sun.com/thread.jspa?threadID=5419973
      • 虽然这个问题已经很老了,但在我看来,有一种更好的方法来实现给定的功能(调用函数)。 URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { parentDirectory.toURI().toURL() }); Class&lt;?&gt; myClass = classLoader.loadClass(className ); Method doStuff= myClass.getDeclaredMethod("doStuff"); doStuff.invoke(helloClass.newInstance());
      • 这可以达到某种目的,我在很多情况下都会使用它,因为我可以拥有具有公共功能的类。
      【解决方案5】:

      我认为它的反射非常简单

      MyClass mobj = MyClass.class.cast(obj);
      

      如果类名不同

      Object newObj = Class.forName(classname).cast(obj);
      

      【讨论】:

      • 这很简单明了。谢谢卢卡斯。
      • 这是有史以来最好的解决方案,我一直在寻找这样的方法,终于找到了它
      • 我正在使用它,但它不适用于原语。 boolean.class.cast(新布尔(假));正在抛出 ClassCastException。知道如何解决这个问题吗?
      • @jDub9 您正在尝试将Boolean(非原始)转换为boolean(原始)
      【解决方案6】:

      如果您不知道mojb 的类型是MyClass,那么您如何创建该变量?

      如果 MyClass 是接口类型或超类型,则无需进行强制转换。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        相关资源
        最近更新 更多