簡體   English   中英

當類名已知時,將 Object 類的 java 對象動態轉換為給定的類

[英]Dynamically converting java object of Object class to a given class when class name is known

是的,我知道。 問題的長標題......所以我在字符串中有類名。 我以這種方式動態創建該類的對象:

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

如何將該obj動態轉換為MyClass對象? 我不能這樣寫:

MyClass mobj = (MyClass)obj;

...因為className可以不同。

我認為它非常直接的反思

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

如果班級名稱不同

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

如果沒有,請聲明一個聲明要調用的方法的接口:

public interface MyInterface
{
  void doStuff();
}

public class MyClass implements MyInterface
{
  public void doStuff()
  {
    System.Console.Writeln("done!");
  }
}

然后你用

MyInterface mobj = (myInterface)obj;
mobj.doStuff();

如果MyClass不在你的控制之下,那么你就無法使它實現一些接口,而另一個選擇是依賴於反射( 參見本教程 )。

您不必將對象轉換為MyClass對象,因為它已經是。 你真正想做的就是拋出它,但由於類名在編譯時是不可知的,所以你不能這樣做,因為你不能聲明該類的變量。 我的猜測是你想要/需要類似“duck typing”的東西,即你不知道類名,但你知道編譯時的方法名。 Gregory提出的接口是您最好的選擇。

如果您不知道mojbMyClass類型,那么如何創建該變量?

如果MyClass是接口類型或超類型,則無需進行轉換。

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

如果要將對象(ob1)強制轉換為類(classA),可以使用以下代碼。

classA instance = (classA) ob1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM