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

问题描述 投票:26回答:5

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

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
5个回答
21
投票

如果没有,请声明一个声明要调用的方法的接口:

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)。


58
投票

我认为它非常直接的反思

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

如果班级名称不同

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

3
投票

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


2
投票

如果您不知道mojbMyClass类型,那么如何创建该变量?

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


0
投票
@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
    return (T) obj;
}
© www.soinside.com 2019 - 2024. All rights reserved.