从 class 搜索路径中的 jar 加载并实例化 class

Load and instantiate class from jar in class search path

我正在寻找一种从我的 class 搜索路径中的 jar 文件实例化对象的方法,我知道 class 的名称和它扩展的父 class及其实现的接口,不幸的是,到目前为止我还没有找到解决方案。 因此,假设如下:

interface Modifier{
 //is basically just a flag
}

然后:

public class ModifierImpl implements Modifier{
 //some methods
}

然后:

public class CustomModifierImpl extends ModifierImpl{
    //some implementation here
    }

那些 interfaces/classes 被放入我在我的项目中动态导入的 jar 中,然后我想实例化 CustomModifierImpl

的实例

因为我知道 class Class 是通用的,所以我认为这样的事情是可能的,但它不是:

private Class<ModifierImpl> loadClass(String fullClassName) {
    Class<ModifierImpl> clazz;
    try {
        clazz= urlLoader.loadClass(fullClassName);
    } catch (ClassNotFoundException e) {
        return null;
    }
    return clazz;
}

我在执行此操作时遇到类型不匹配问题,有没有其他方法可以实现此目的?我不想在我的程序周围使用 Class<?> 的实例,因为我可能需要做几十次转换。

这也行不通:

private Class<ModifierImpl> loadClass(String fullClassName) {
    Class<ModifierImpl> clazz;
    try {
        clazz= urlLoader.loadClass(fullClassName).cast(clazz);
    } catch (ClassNotFoundException e) {
        return null;
    }
    return clazz;
}

谢谢

从 .class 文件加载 class

File file2 = new File  ("c:\myclasses\");

// Convert File to a URL
URL url = file2.toURL();          // file:/c:/myclasses/
 URL[] urls = new URL[]{url};

// Create a new class loader with the directory
ClassLoader cl = new URLClassLoader(urls);

 // Load in the class; 
 Class cls = cl.loadClass("test.MyClass");

获取 class:

Class aClass;
ClassLoader classLoader = test.class.getClassLoader();
try {
    aClass = classLoader.loadClass(fullClassName);
   } catch (ClassNotFoundException e) {
   e.printStackTrace();
 }

一旦你有了class,你就可以实例化它了:

Class<?> clazz = Class.forName(fullClassName);
Constructor<?> constructor = clazz.getConstructor();
Object result = constructor.newInstance();