首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java ClassLoader学习3:自定义ClassLoader

2013-11-30 
Java ClassLoader学习三:自定义ClassLoaderclass NetworkClassLoader extends ClassLoader {String hosti

Java ClassLoader学习三:自定义ClassLoader
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方法。

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;}@Overrideprotected 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 falseSystem.out.println(clazz.equals(clazz2));//return falseSystem.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:falsefalsec1.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]

?

ExtClassLoader找不到,AppClassLoader自己去找。Java ClassLoader学习3:自定义ClassLoaderAppClassLoader找不到J,yzClassLoader自己去找。Java ClassLoader学习3:自定义ClassLoader

热点排行