自定义classloader示例
public class ClTest { /** * @param args */ public static void main(String[] args) throws Exception { //classloader1 ClassLoader classLoader1 = defCl("D:/tmp/classes"); runClTest(classLoader1); } private static void runClTest(ClassLoader classLoader1) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { // 使用loadClass方法加载class,这个class是在urls参数指定的 Class<?> clazz = classLoader1.loadClass("com.taobao.cl.module.User"); System.out.println("clazz_cl=" + clazz.getClassLoader()); System.out.println("parent_clazz_cl=" + classLoader1.getParent()); // 构造对象 Constructor<?> constructor = clazz.getDeclaredConstructor(new Class[] {int.class, String.class }); Object instance = constructor.newInstance(12, "lilei"); // 然后我们就可以用反射做些事情了 Method taskMethod = clazz.getMethod("sayHello", new Class[] { String.class }); taskMethod.invoke(instance, new Object[] { "jack" }); System.out.println("---------------------"); System.out.println("success"); System.out.println("ClTest_cl=" + ClTest.class.getClassLoader()); System.out.println("User_cl=" + instance.getClass().getClassLoader()); } private static ClassLoader defCl(String file) throws Exception{ URL jarUrl = new File(file).toURI().toURL(); System.out.println("url=" + jarUrl); URL[] urls = new URL[] { jarUrl }; URLClassLoader cl = new URLClassLoader(urls); return cl; } }
输出结果
D:\java_tools\tmp_tools\ws\simple\target\classes>java com.hy.cl.ClTest url=file:/D:/tmp/classes/ clazz_cl=java.net.URLClassLoader@16de49c parent_clazz_cl=sun.misc.Launcher$AppClassLoader@1bd7848 Hello jack,i am 12,my name is lilei --------------------- success ClTest_cl=sun.misc.Launcher$AppClassLoader@1bd7848 User_cl=java.net.URLClassLoader@16de49c ------------------------------------------- D:\java_tools\tmp_tools\ws\simple\target\classes>java com.hy.cl.ClTest url=file:/D:/tmp/classes/ clazz_cl=sun.misc.Launcher$AppClassLoader@1bd7848 parent_clazz_cl=sun.misc.Launcher$AppClassLoader@1bd7848 Hello jack,i am 12,my name is lilei --------------------- success ClTest_cl=sun.misc.Launcher$AppClassLoader@1bd7848 User_cl=sun.misc.Launcher$AppClassLoader@1bd7848
可以看出2次输出结果的区别吗?工程的当前classpath路径下存在com.hy.cl.module.User,如果不删除,那么自定义的loader的父loader会优先加载之,即出现后面的一种情况,类User的loader都是App。当我删除后,类User的loader即为自定义loader.
再增加一个自定义loader,用来加载同样的类User
//classloader2 ClassLoader classLoader2 = defCl("D:/tmp/classes"); runClTest(classLoader2);
输出结果:
D:\java_tools\tmp_tools\ws\simple\target\classes>java com.hy.cl.ClTest url=file:/D:/tmp/classes/ clazz_cl=java.net.URLClassLoader@1f6226 parent_clazz_cl=sun.misc.Launcher$AppClassLoader@1bd7848 Hello jack,i am 12,my name is lilei --------------------- success ClTest_cl=sun.misc.Launcher$AppClassLoader@1bd7848 User_cl=java.net.URLClassLoader@1f6226 ============================== url=file:/D:/tmp/classes/ clazz_cl=java.net.URLClassLoader@76fba0 parent_clazz_cl=sun.misc.Launcher$AppClassLoader@1bd7848 Hello jack,i am 12,my name is lilei --------------------- success ClTest_cl=sun.misc.Launcher$AppClassLoader@1bd7848 User_cl=java.net.URLClassLoader@76fba0
相关推荐
自定义classloader的使用
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;
热修复和插件化是目前比较热门的技术,要想更好的掌握它们需要了解ClassLoader,下面这篇文章主要给大家介绍了关于Android中自定义ClassLoader耗时问题追查的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
自定义 ClassLoader 加载任何类时的类名。 ":myCommand" 命令位于默认 REPL 命令之上。 scala > val hello = " hello " MyClassLoader loads classOf < root>.$line3 <<中略>> MyClassLoader loads classOf ...
案1:修改序列化byte数据该法可解决序列化最终数据的serialVesionUID不致,但法解决Object的serialVesionUID不案2:反射修改s
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
这篇文章主要讲类加载器在android中如何动态的加载其他工程类的过程,对于类加载器的知识就跳过了。
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4
classloader 源码,自定义classloader
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
eclipse工程格式 博文链接:https://aga.iteye.com/blog/200818
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
java9 源码下载 问题引入 我们平时的开发中经常要引入各种sdk,现在我希望在代码中引入 ,你可以把这个demo 看作是MQ 的sdk,echo方法看成是MQ的send方法,功能就是输出序列化好的字符串... public ...
运用代理模式,通过自定义classloader对代码加密,啊;敌法;打飞机
框架开发学习 此仓库给出了在框架开发中经常使用的不同Java概念和编程技术的示例。 例如,当我们想从头开始创建RPC框架时,我们需要了解Java动态代理和序列化。 这是清单: 技术 模块/链接 设想 ...
Java 自定义ClassLoader 实现类的热替换核心代码
通过自定义ClassLoader,实现动态加载apk,jar包功能。
使用自定义Classloader机制,实现xlass的加载。 实现xlass打包的xar(类似class文件打包的jar)的加载:xar里是xlass。 基于自定义Classloader实现类的动态加载和卸载:需要设计加载和卸载。 基于自定义Classloader...
13. 自定义ClassLoader 13 14. double保留两位数的两个方案 18 16. 用户输入输出,文件输入输出范例(1) 19 17.以指定符号分割显示 22 17. 单例模式 22 18. 工厂模式 23 19. 读取配置文件(1) 25 20. 根据libName动态...