Heim > Java > javaLernprogramm > Hauptteil

So lösen Sie das Problem, dass Java Class.forName zum Laden externer Jar-Klassendateien verwendet

WBOY
Freigeben: 2023-05-10 23:49:12
nach vorne
1665 Leute haben es durchsucht

故事背景

在一个框架叫 magic-api 里,可以低代码的方式写代码,动态编译执行,但是要想加载一些 import 类进来,需要前提在项目里加载 jar 完成后才可以 import,那么这样每来一个新的 class,就都需要重新加载 class 到项目,然后打包项目,再 import……非常繁琐!!!

当然这边还要提到 magic 的一个大概执行过程,拿到一份源码时,头文件上的 import 会经过源码里 Class.forName 进行加载到内存,有人会说,那直接用 URLClassLoader 不就行了,的确可以,但是这样需要改源码了,也比较繁琐,所以为了不该源码,怎么去兼容又方便的解决这个问题呢?

解决方案

那么就产生了一个问题,是否有一种办法可以直接通过外部 jar 直接加载 class 到 JVM 内存呢?

这里大概思路是用 URLClassLoader 来接收文件,然后 Class.forName 就能在项目范围内拿到该类去加载到内存,就是这样。

顺便提一句:那 magic-api 框架如何兼容这个问题呢,因为需要用到 URLClassLoader,其实在 magic-api 执行拿到的源码前,提供了一个拦截器,我们可以把 URLClassLoader 放到那边去做即可!

public class ClassLoadTest {
 
    public void test() {
        // 外部 jar 所在位置
        String path = "file:C:\\Users\\Boomni_Sun\\Desktop\\chinadaas-magic-api-0.3.1-SNAPSHOT.jar";
        URLClassLoader urlClassLoader = null;
        try {
            // 通过URLClassLoader加载外部jar
            urlClassLoader = new URLClassLoader(new URL[]{new URL(path)});
            Class<?> cls = Class.forName("com.chinadaas.magic.api.utils.MyTest", false, urlClassLoader);
            Object instance = cls.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 卸载关闭外部jar
            try {
                urlClassLoader.close();
            } catch (IOException e) {
                System.out.println("关闭外部jar失败:" + e.getMessage());
            }
        }
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem, dass Java Class.forName zum Laden externer Jar-Klassendateien verwendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage