当类名已知时,将 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<?> 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 对象动态转换为给定的类的主要内容,如果未能解决你的问题,请参考以下文章