wordpress英语培训主题,品牌seo如何优化,做vi的设计公司,购物网站 服务器 带宽 多大1.ClasserLoader介绍#xff1f;
classloader顾名思义#xff0c;即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存#xff0c;并对数据进行检验、转换解析和初始化#xff0c;最终形成可以被虚拟机直接使用的Java类型#xff0c;这就是虚拟机的类加载机制。…1.ClasserLoader介绍
classloader顾名思义即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存并对数据进行检验、转换解析和初始化最终形成可以被虚拟机直接使用的Java类型这就是虚拟机的类加载机制。了解java的类加载机制可以快速解决运行时的各种加载问题并快速定位其背后的本质原因也是解决疑难杂症的利器。因此学好类加载原理也至关重要。
内置类加载器
JVM 中内置了三个重要的 ClassLoader
BootstrapClassLoader(启动类加载器)最顶层的加载类由 C实现通常表示为 null并且没有父级主要用来加载 JDK 内部的核心类库 %JAVA_HOME%/lib目录下的 rt.jar、resources.jar、charsets.jar等 jar 包和类以及被 -Xbootclasspath参数指定的路径下的所有类。ExtensionClassLoader(扩展类加载器)主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。AppClassLoader(应用程序类加载器)面向我们用户的加载器负责加载当前应用 classpath 下的所有 jar 包和类。
除了这三种类加载器之外用户还可以加入自定义的类加载器来进行拓展以满足自己的特殊需求。就比如说我们可以对 Java 类的字节码 .class 文件进行加密加载时再利用自定义的类加载器对其解密。
2.代码工程
实验目标
实现加载外部jar包并调用其中类方法 JarLoader
package com.et;import java.net.URL;
import java.net.URLClassLoader;
import java.lang.reflect.Method;
import java.io.File;public class JarLoader {private URLClassLoader urlClassLoader;// load JAR filepublic void loadJar(String jarFilePath) throws Exception {File jarFile new File(jarFilePath);URL jarUrl jarFile.toURI().toURL();urlClassLoader new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());System.out.println(JAR Loaded: jarFilePath);}//load class from JAR and invoke methodpublic void invokeClassMethod(String className, String methodName) throws Exception {if (urlClassLoader ! null) {Class? loadedClass urlClassLoader.loadClass(className);Method method loadedClass.getDeclaredMethod(methodName);method.invoke(loadedClass.newInstance());System.out.println(Method Invoked: methodName);} else {System.out.println(ClassLoader is null, load a JAR first.);}}// unload JARpublic void unloadJar() throws Exception {if (urlClassLoader ! null) {urlClassLoader.close(); // close ClassLoaderurlClassLoader null; // let it recycle by jvmSystem.out.println(JAR Unloaded.);} else {System.out.println(No JAR to unload.);}}
}
service(demo模块)
创建sevice类mvn install 打包成jar包
package com.et.demo.service;public class MockService implements Service {Overridepublic void printVersion() {System.out.println(11.0);}
}
package com.et.demo.service;public interface Service {void printVersion();
}
以上只是一些关键代码所有代码请参见下面代码仓库
代码仓库
GitHub - Harries/Java-demo(classloader)
3.测试
编写测试类
package com.et;public class Main {public static void main(String[] args) throws Exception {JarLoader jarLoader new JarLoader();// load JARjarLoader.loadJar(D:\\IdeaProjects\\Java-demo\\demo\\target\\demo-1.0-SNAPSHOT.jar);// invoke the methodjarLoader.invokeClassMethod(com.et.demo.service.MockService, printVersion);// unload JARjarLoader.unloadJar();}
}
启动main方法查看日志
JAR Loaded: D:\IdeaProjects\Java-demo\demo\target\demo-1.0-SNAPSHOT.jar
11.0
Method Invoked: printVersion
JAR Unloaded.
Disconnected from the target VM, address: 127.0.0.1:53226, transport: socketProcess finished with exit code 0
4.引用
ClassLoader (Java Platform SE 7 )利用ClasserLoader来实现jar包加载并调用里面的方法 | Harries Blog™