从泛型类调用Java方法

从泛型类调用Java方法,java,list,generics,methods,reflection,Java,List,Generics,Methods,Reflection,这是可能的 List<?> myList = getMyList(); class cls = class.forname("com.lab.myClass"); cls = myList.get(0); cls.getValue(); List myList=getMyList(); class cls=class.forname(“com.lab.myClass”); cls=myList.get(0); cls.getValue(); 使用类的完全限定名创建一个实例,并使用

这是可能的

List<?> myList = getMyList();
class cls = class.forname("com.lab.myClass");
cls = myList.get(0);
cls.getValue();
List myList=getMyList();
class cls=class.forname(“com.lab.myClass”);
cls=myList.get(0);
cls.getValue();

使用类的完全限定名创建一个实例,并使用它们声明的方法?

否,如果调用
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
        }
    }
}
//在Plugin.java文件中
接口插件{
无效剂量();
}
//在Main.java文件中
公共类主{
...
void runPlugin(){
试一试{
Class pluginClass=Class.forName(“pkg.name.MyPlugin”);
Plugin Plugin=(Plugin)pluginClass.newInstance();
plugin.doSomething();
}
捕获(…){
//捕捉必要的异常
}
}
}

您正在寻找类似的名称吗?如果您有完全限定的名称,您就知道它是什么类型的。如果您知道它是什么类型的,就直接使用它。您是否遵循了一些关于java反射的教程?你应该这样做,这会让你在未来(和现在)不再沮丧。