Java ClassLoader如何实现长尾词热部署原理?

2026-04-02 00:281阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计647个文字,预计阅读时间需要3分钟。

Java ClassLoader如何实现长尾词热部署原理?

类加载器(ClassLoader)是Java的一种加载机制,用于加载.class文件到JVM中。正确使用自定义的类加载器,可以按照以下步骤进行:

Java ClassLoader如何实现长尾词热部署原理?

1. 创建一个类,继承自`java.lang.ClassLoader`。

2.重写`findClass(String name)`方法,用于找到并返回指定的类。

3.在`findClass`方法中,读取并定义类文件,然后将其转换为`Class`对象。

4.使用自定义类加载器加载自定义的jar包。

以下是一个简单的示例代码:

java

package com.py.classloader.test.clazz;

public class MyClassLoader extends ClassLoader { public Class findClass(String name) throws ClassNotFoundException { byte[] classData=loadClassData(name); if (classData==null) { throw new ClassNotFoundException(name); } return defineClass(name, classData, 0, classData.length); }

private byte[] loadClassData(String name) { // 这里添加代码来读取类文件,并返回字节数组 // 例如:从文件系统或网络等 return null; }}

使用自定义类加载器加载自定义jar包:

javapublic class Main { public static void main(String[] args) throws Exception { MyClassLoader myClassLoader=new MyClassLoader(); Class clazz=myClassLoader.loadClass(com.py.example.MyClass); Object instance=clazz.newInstance(); // 使用instance对象... }}

classloader就是java的加载器。如何正确使用自己打包一个自定义的jar包packagecom.py.classloader.test.clazz;public

classloader就是java的加载器。如何正确使用

自己打包一个自定义的jar包

package com.py.classloader.test.clazz;public class TestBean {String str;public TestBean(String str) {this.str = str;}@Overridepublic String toString() {return "test bean:" + str;}} package com.py.classloader.test.clazz;import com.py.classloader.test.Test1S;public class TestService {public static TestBean getTestBean(String str) {System.out.println(Test1S.test());TestBean t = new TestBean(str);return t;}} package com.py.classloader.test.clazz;/** * 测试主线程 * * @author cyd * @date 2018年5月16日 */public class Main implements Runnable {@Overridepublic void run() {new Thread(()->{System.out.println("main start");int i = 0;while (true) {System.out.println(TestService.getTestBean("test" + ++i));try {Thread.sleep(2000);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}}

打包完成后把test.jar放到测试main函数所在工程目录下

package com.py.classloader.test;public class Test1S {public static String test() {return "Test1S.test()+564564";}} package com.py.classloader.test;import java.io.File;import java.net.URL;import java.net.URLClassLoader;/*** 类加载器ClassLoader测试** @author cyd* @date 2018年5月16日*/public class ClassLoaderTestMain {static File jarFile = new File("jar_classloader/test.jar");public static void main(String[] args) {try {testMainRun();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static ClassLoader getClassLoader() throws Exception {ClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}, ClassLoaderTestMain.class.getClassLoader());return loader;}public static void testMainRun() throws Exception {try {Class mainLoaderClazz = ClassLoaderTestMain.class.getClassLoader().loadClass("com.py.classloader.test.clazz.Main");System.out.println(mainLoaderClazz);} catch (Exception e) {e.printStackTrace();}ClassLoader loader = getClassLoader();Class clazz = loader.loadClass("com.py.classloader.test.clazz.Main");Runnable main = (Runnable)clazz.newInstance();main.run();}}

就可以得到运行结果

可见这个test.jar中的类在主加载器中是加载不到的。

这样就把纯业务逻辑分离出来打成独立的jar包,然后通过通过ClassLoader配合文件监听系统 比如apache的commons-vfs来做java的热部署

本文共计647个文字,预计阅读时间需要3分钟。

Java ClassLoader如何实现长尾词热部署原理?

类加载器(ClassLoader)是Java的一种加载机制,用于加载.class文件到JVM中。正确使用自定义的类加载器,可以按照以下步骤进行:

Java ClassLoader如何实现长尾词热部署原理?

1. 创建一个类,继承自`java.lang.ClassLoader`。

2.重写`findClass(String name)`方法,用于找到并返回指定的类。

3.在`findClass`方法中,读取并定义类文件,然后将其转换为`Class`对象。

4.使用自定义类加载器加载自定义的jar包。

以下是一个简单的示例代码:

java

package com.py.classloader.test.clazz;

public class MyClassLoader extends ClassLoader { public Class findClass(String name) throws ClassNotFoundException { byte[] classData=loadClassData(name); if (classData==null) { throw new ClassNotFoundException(name); } return defineClass(name, classData, 0, classData.length); }

private byte[] loadClassData(String name) { // 这里添加代码来读取类文件,并返回字节数组 // 例如:从文件系统或网络等 return null; }}

使用自定义类加载器加载自定义jar包:

javapublic class Main { public static void main(String[] args) throws Exception { MyClassLoader myClassLoader=new MyClassLoader(); Class clazz=myClassLoader.loadClass(com.py.example.MyClass); Object instance=clazz.newInstance(); // 使用instance对象... }}

classloader就是java的加载器。如何正确使用自己打包一个自定义的jar包packagecom.py.classloader.test.clazz;public

classloader就是java的加载器。如何正确使用

自己打包一个自定义的jar包

package com.py.classloader.test.clazz;public class TestBean {String str;public TestBean(String str) {this.str = str;}@Overridepublic String toString() {return "test bean:" + str;}} package com.py.classloader.test.clazz;import com.py.classloader.test.Test1S;public class TestService {public static TestBean getTestBean(String str) {System.out.println(Test1S.test());TestBean t = new TestBean(str);return t;}} package com.py.classloader.test.clazz;/** * 测试主线程 * * @author cyd * @date 2018年5月16日 */public class Main implements Runnable {@Overridepublic void run() {new Thread(()->{System.out.println("main start");int i = 0;while (true) {System.out.println(TestService.getTestBean("test" + ++i));try {Thread.sleep(2000);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}}

打包完成后把test.jar放到测试main函数所在工程目录下

package com.py.classloader.test;public class Test1S {public static String test() {return "Test1S.test()+564564";}} package com.py.classloader.test;import java.io.File;import java.net.URL;import java.net.URLClassLoader;/*** 类加载器ClassLoader测试** @author cyd* @date 2018年5月16日*/public class ClassLoaderTestMain {static File jarFile = new File("jar_classloader/test.jar");public static void main(String[] args) {try {testMainRun();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static ClassLoader getClassLoader() throws Exception {ClassLoader loader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}, ClassLoaderTestMain.class.getClassLoader());return loader;}public static void testMainRun() throws Exception {try {Class mainLoaderClazz = ClassLoaderTestMain.class.getClassLoader().loadClass("com.py.classloader.test.clazz.Main");System.out.println(mainLoaderClazz);} catch (Exception e) {e.printStackTrace();}ClassLoader loader = getClassLoader();Class clazz = loader.loadClass("com.py.classloader.test.clazz.Main");Runnable main = (Runnable)clazz.newInstance();main.run();}}

就可以得到运行结果

可见这个test.jar中的类在主加载器中是加载不到的。

这样就把纯业务逻辑分离出来打成独立的jar包,然后通过通过ClassLoader配合文件监听系统 比如apache的commons-vfs来做java的热部署