这样的事情是可能的。
List<?> myList = getMyList();
class cls = class.forname("com.lab.myClass");
cls = myList.get(0);
cls.getValue();
使用类的完全限定名称创建一个实例并使用它们声明的方法?
答案 0 :(得分:1)
不,如果你调用Class.forName
,在编译时你对返回的Class
实例一无所知。你甚至不知道它代表了一个阶级;例如,它可能是一个界面。特别是,如果它是一个类并且您创建了它的实例,则除了那些已经在Object
中定义的方法之外,您不能调用它的任何方法,因为在编译时,编译器无法检查这些方法是否存在。
这是两个解决方案:
首先,您可以使用反射来查找类具有的方法,并调用这些方法。这非常麻烦。
其次,如果您使用Class.forName
在运行时动态加载类,通常您会对所加载的类有所了解。例如,您可能知道该类实现了某个接口。然后,您可以将newInstance
的结果转换为此接口,然后直接调用此接口中定义的方法。
例如:
// in file Plugin.java
interface Plugin {
void doSomething();
}
// in file Main.java
public class Main {
...
void runPlugin() {
try {
Class<?> pluginClass = Class.forName("pkg.name.MyPlugin");
Plugin plugin = (Plugin) pluginClass.newInstance();
plugin.doSomething();
}
catch (...) {
// catch the necessary exceptions
}
}
}