当类名已知时,将Object类的java对象动态转换为给定的类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当类名已知时,将Object类的java对象动态转换为给定的类相关的知识,希望对你有一定的参考价值。
是的,我知道。问题的长标题...所以我在字符串中有类名。我以这种方式动态创建该类的对象:
String className = "com.package.MyClass";
Class c = Class.forName(className);
Object obj = c.newInstance();
我如何动态地将该obj转换为MyClass对象?我不能这样写:
MyClass mobj = (MyClass)obj;
...因为className可以是不同的。
答案
如果没有,请声明一个声明要调用的方法的接口:
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)。
另一答案
我认为它非常直接的反思
MyClass mobj = MyClass.class.cast(obj);
如果班级名称不同
Object newObj = Class.forName(classname).cast(obj);
另一答案
您不必将对象转换为MyClass对象,因为它已经是。你真正想做的就是抛出它,但由于类名在编译时是不可知的,所以你不能这样做,因为你不能声明该类的变量。我的猜测是你想要/需要类似“duck typing”的东西,即你不知道类名,但你知道编译时的方法名。 Gregory提出的接口是您最好的选择。
另一答案
如果您不知道mojb
是MyClass
类型,那么如何创建该变量?
如果MyClass是接口类型或超类型,则无需进行转换。
另一答案
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
return (T) obj;
}
以上是关于当类名已知时,将Object类的java对象动态转换为给定的类的主要内容,如果未能解决你的问题,请参考以下文章