一.自定义ClassLoader关键
- 是继承ClassLoader还是继承URLClassLoader。
- 如果你的class文件存放于一个JAR文件里,同时你需要一些自己的load策略,可以考虑继承URLClassLoader。
- 如果你的class文件位于其它地方,继承ClassLoader。比喻位于普通文件夹里,可以自定义一个JyzClassLoader;如果位于网络上,可以定义一个NetworkClassLoaer,等等。
class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } }
- 重写findClass方法。
二.JyzClassLoader
package com.jyz.study.jdk.classLoader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.WritableByteChannel; import java.util.Arrays; /** * 自定义ClassLoader * @author JoyoungZhang@gmail.com * */ public class JyzClassLoader extends ClassLoader { private String classPath; public JyzClassLoader(String classPath) { this.classPath = classPath; } @Override protected Class<?> findClass(String className) throws ClassNotFoundException { byte[] bytes = loadClassData(className); Class<?> clazz = defineClass(className, bytes, 0, bytes.length); fillSigners(clazz); return clazz; } //测试ClassLoader setSigners的用法 private void fillSigners(Class<?> clazz){ Object[] singers = new Object[1]; singers[0] = "JoyoungZhang@gmail.com"; this.setSigners(clazz, singers); } private byte[] loadClassData(String className) throws ClassNotFoundException { try { String classFile = getClassFile(className); FileInputStream fis = new FileInputStream(classFile); FileChannel fileC = fis.getChannel(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); WritableByteChannel outC = Channels.newChannel(baos); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); while (true) { int i = fileC.read(buffer); if (i == 0 || i == -1) { break; } buffer.flip(); outC.write(buffer); buffer.clear(); } fis.close(); return baos.toByteArray(); } catch (IOException fnfe) { throw new ClassNotFoundException(className); } } private String getClassFile(String name) { StringBuffer sb = new StringBuffer(classPath); sb.append(File.separator).append(name.replace('.', File.separatorChar)).append(".class"); return sb.toString(); } public static void main(String[] args) { try { JyzClassLoader classLoader = new JyzClassLoader("D:\\GoogleCode\\platform-components\\trunk\\SourceCode\\component-core\\target\\classes"); Class<?> clazz = classLoader.loadClass("com.jyz.component.core.collection.Tuple"); JyzClassLoader classLoader2 = new JyzClassLoader("D:\\GoogleCode\\platform-components\\trunk\\SourceCode\\component-core\\target\\classes"); Class<?> clazz2 = classLoader2.loadClass("com.jyz.component.core.collection.Tuple"); System.out.println(clazz == clazz2);//return false System.out.println(clazz.equals(clazz2));//return false System.out.println("c1.getSigners is " + Arrays.toString(clazz.getSigners())); System.out.println(clazz.newInstance()); System.out.println(Arrays.toString(classLoader.getPackages())); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } } } console output: false false c1.getSigners is [JoyoungZhang@gmail.com] Tuple[t1:null, t2:null] [package java.util.jar, Java Platform API Specification, version 1.6, package java.nio.channels, Java Platform API Specification, version 1.6, package java.util, Java Platform API Specification, version 1.6, package sun.util, Java Platform API Specification, version 1.6, package java.net, Java Platform API Specification, version 1.6, package sun.reflect.misc, Java Platform API Specification, version 1.6, package sun.security.provider, Java Platform API Specification, version 1.6, package sun.net.www.protocol.jar, Java Platform API Specification, version 1.6, package sun.security.action, Java Platform API Specification, version 1.6, package java.nio.charset, Java Platform API Specification, version 1.6, package sun.io, Java Platform API Specification, version 1.6, package java.io, Java Platform API Specification, version 1.6, package sun.nio, Java Platform API Specification, version 1.6, package sun.net.www, Java Platform API Specification, version 1.6, package java.util.zip, Java Platform API Specification, version 1.6, package java.lang.ref, Java Platform API Specification, version 1.6, package java.lang, Java Platform API Specification, version 1.6, package sun.misc, Java Platform API Specification, version 1.6, package sun.net.www.protocol.file, Java Platform API Specification, version 1.6, package java.util.concurrent, Java Platform API Specification, version 1.6, package java.util.concurrent.atomic, Java Platform API Specification, version 1.6, package java.nio.charset.spi, Java Platform API Specification, version 1.6, package java.nio.channels.spi, Java Platform API Specification, version 1.6, package java.nio, Java Platform API Specification, version 1.6, package java.util.concurrent.locks, Java Platform API Specification, version 1.6, package java.security, Java Platform API Specification, version 1.6, package sun.reflect, Java Platform API Specification, version 1.6, package java.lang.reflect, Java Platform API Specification, version 1.6, package sun.nio.cs, Java Platform API Specification, version 1.6, package sun.security.util, Java Platform API Specification, version 1.6, package sun.nio.cs.ext, package com.jyz.study.jdk.classLoader, package java.security.cert, Java Platform API Specification, version 1.6, package sun.nio.ch, Java Platform API Specification, version 1.6, package sun.net.util, Java Platform API Specification, version 1.6, package sun.jkernel, Java Platform API Specification, version 1.6]
三.再来说说laodClass
http://zy19982004.iteye.com/blog/1983240里文字解释了一下loadClass的过程。下面debug一下。
进入点Class<?> clazz = classLoader.loadClass("com.jyz.component.core.collection.Tuple");
- JyzClassLoader委派给AppClassLoader,AppClassLoader委派给ExtClassLoader,ExtClassLoader委派给BootstrapLoader,BootstrapLoader找不到,ExtClassLoader自己去找。想想为什么JyzClassLoader会委派给AppClassLoader?参考http://zy19982004.iteye.com/blog/1983240。
- ExtClassLoader找不到,AppClassLoader自己去找。
- AppClassLoader找不到J,yzClassLoader自己去找。
相关推荐
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
java6.0源码 ![]() HikariCP更快。 Hi·ka·ri [hi·ka·'lē] (*来源:日本*):光; 射线。 [![构建状态]() [![问题统计]() [![问题统计]() [![覆盖状态]() [![依赖状态]() 快速、简单、可靠。 HikariCP 是一个“零...
1.java classloader 的概述 2.java classloader 的分类 3.自定义 java classloader
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
classloader 源码,自定义classloader
构建: ./make-jar.sh 要使用,将indexed-classpath.jar添加到类路径并设置-Djava.system.class.loader=org.pantsbuild.classloader.IndexedURLClassLoader 。 添加-verbose:class以查看来自类加载器的调试信息。
ClassLoader的API使用和自定义
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
java9 源码下载 问题引入 我们平时的开发中经常要引入各种sdk,现在我希望在代码中引入 ,你可以把这个demo 看作是MQ 的sdk,echo方法看成是MQ的send方法,功能就是输出序列化好的字符串... public class HelloWorld {...
类的动态装载机制是JVM的一...本文介绍了JVM中类装载的原理、实现以及应用,尤其分析了ClassLoader的结构、用途以及如何利用自定义 的ClassLoader装载并执行Java类,希望能使读者对JVM中的类装载有一个比较深入的理解。
主要介绍了Java Classloader机制用法代码解析,涉及JDK默认ClassLoader,双亲委托模型,自定义ClassLoader等相关内容,具有一定借鉴价值,需要的朋友可以参考下
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
Java加壳核心代码,请调试后使用。本资源配合博客进行讲解,博客地址:http://blog.csdn.net/JavaBuilt/article/details/79522837
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解
自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制
《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。 《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...
Java 自定义ClassLoader 实现类的热替换核心代码
类加载器 以下代码是一个自定义类加载器,它从 jar 文件加载类。
独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\lanswon Tomcat等JAVA Web Server,修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\lanswon JBOSS等...