当类名已知时,将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提出的接口是您最好的选择。

另一答案

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

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

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

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

[转]Java反射机制详解

java,根据一个动态的map如何动态 往 Object[] array=new Object[];添加值

转:java 类名 this 的使用

Object详解(转)

反射???

java-4