当类名已知时,将 Object 类的 java 对象动态转换为给定的类

Posted

技术标签:

【中文标题】当类名已知时,将 Object 类的 java 对象动态转换为给定的类【英文标题】:Dynamically converting java object of Object class to a given class when class name is known 【发布时间】: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 可以不同。

【问题讨论】:

该代码不会转换:它会进行类型转换。是这个意思吗? 【参考方案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 是接口类型或超类型,则无需进行强制转换。

【讨论】:

以上是关于当类名已知时,将 Object 类的 java 对象动态转换为给定的类的主要内容,如果未能解决你的问题,请参考以下文章

TheFifthWeekText

java-4

解析java-object类

Java 类的修饰符

13-Object&包装类

Java基础10—类的高级特性