我无法在使用反射时找到如何对动态创建的类进行类型转换。
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方法都是单独的事情)。有什么建议 ?请提前预约。
答案 0 :(得分:5)
使用反射卢克......
Method writeOutMethod = unknownClass.getMethod("Writeout", new Class[]{});
writeOutMethod.invoke(retobj, new Object[]{});
或者,确保您的对象实现了众所周知的接口(干净的方法)。
答案 1 :(得分:1)
施展它:
((YourObjectWithThatMethod) retobj).Writeout();
编辑(参见Kevin Welker的评论):
如果你的所有9个类都实现了相同的接口,你可以将每个类强制转换为该接口:
((YourInterface) retobj).Writeout();
答案 2 :(得分:1)
9个类都应该实现一个声明Output
方法的接口(让我们称之为writeOut()
)。因此代码是:
Output retobj = (Output) defaultConstructor.newInstance(null);
retobj.writeOut();
请注意,您可以使用unknownClass.newInstance()
来调用no-arg构造函数。
附注:请尊重Java命名约定:方法以小写字母开头。
答案 3 :(得分:1)
如果所有九个类共享一个超类或一个声明/实现writeOut
的接口,那么你可以将retobj
转换为该接口,然后调用它。
public interface Writable {
public void writeOut();
}
然后每个类都需要在类声明中。
class MyClass implements Writable {
}
然后你可以说
((Writable) retobj).writeOut();