2

我很难找到如何在使用反射时对动态创建的类进行类型转换。

String s;
...
Class unknownClass = Class.forName(s); 
Constructor defaultConstructor = unknownClass.getConstructor(null);

Object retobj = defaultConstructor.newInstance(null);
retobj.Writeout(); // This won't work since; 

对象类没有称为 Writeout 的方法,但这是由此处动态创建的其他九个可能的类共享的方法的名称(不用说每个 Writeout 方法都做单独的事情)。有什么建议么 ?提前谢谢您的时间。

4

4 回答 4

5

使用反射卢克...

Method writeOutMethod = unknownClass.getMethod("Writeout", new Class[]{});
writeOutMethod.invoke(retobj, new Object[]{});

或者,确保您的对象实现一个众所周知的接口(干净的方法)。

于 2012-05-10T17:22:46.433 回答
1

投射它:

 ((YourObjectWithThatMethod) retobj).Writeout(); 

编辑(见 Kevin Welker 的评论):

如果所有 9 个类都实现了相同的接口,则可以将每个类强制转换为该接口:

 ((YourInterface) retobj).Writeout(); 
于 2012-05-10T17:20:40.060 回答
1

9 个类都应该实现一个Output声明writeOut()方法的接口(我们称之为它)。因此,代码将是:

Output retobj = (Output) defaultConstructor.newInstance(null);
retobj.writeOut();

请注意,您可以只使用unknownClass.newInstance()来调用无参数构造函数。

旁注:请尊重 Java 命名约定:方法以小写字母开头。

于 2012-05-10T17:21:37.573 回答
1

如果所有九个类共享一个超类或一个声明/实现的接口,writeOut那么您可以retobj转换为该接口然后调用它。

public interface Writable {
    public void writeOut();
}

然后每个类都需要在类声明中拥有。

class MyClass implements Writable {
}

然后你可以说

((Writable) retobj).writeOut();
于 2012-05-10T17:21:51.563 回答