如何对通过反射创建的对象进行类型转换以运行方法?

时间:2012-05-10 17:16:24

标签: java reflection

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

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 个答案:

答案 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();