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

时间:2009-12-12 13:02:02

标签: java class object type-conversion

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

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

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

MyClass mobj = (MyClass)obj;

...因为 className 可能不同。

5 个答案:

答案 0 :(得分:60)

我认为它非常直接的反思

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

如果班级名称不同

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

答案 1 :(得分:22)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

@SuppressWarnings("unchecked")
private static <T extends Object> T cast(Object obj) {
    return (T) obj;
}