当父类的class文件找到时,就用父类的加载,而当父类的class文件找不到时,就用子类的加载。
- <span style="font-size:18px;">package com.itm.one;
- import java.io.ByteArrayOutputStream;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- public class MyClassLoader extends ClassLoader{
- /**
- * @param args
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- String srcPath = args[0];
- String destDir = args[1];
- FileInputStream fis = new FileInputStream(srcPath);
- String destFileName = srcPath.substring(srcPath.lastIndexOf('\\')+1);
- String destPath = destDir + "\\" + destFileName;
- FileOutputStream fos = new FileOutputStream(destPath);
- cypher(fis,fos);
- fis.close();
- fos.close();
- }
- private static void cypher(InputStream ips ,OutputStream ops) throws Exception{
- int b = -1;
- while((b=ips.read())!=-1){
- ops.write(b ^ 0xff);
- }
- }
- <span style="color:#CC0000;">private String classDir;
- @Override
- protected Class<?> findClass(String name) throws ClassNotFoundException {
- String classFileName = classDir + "\\" + name.substring(name.lastIndexOf(".")+1) + ".class";
- try {
- FileInputStream fis = new FileInputStream(classFileName);
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- cypher(fis,bos);
- fis.close();
- System.out.println("-------");
- byte[] bytes = bos.toByteArray();
- return defineClass(bytes,0,bytes.length);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return super.findClass(name);
- }
- public MyClassLoader(){
- }
- public MyClassLoader(String classDir){
- this.classDir = classDir;
- }</span>
- }</span>
- <span style="font-size:18px;">public class ClassLoaderAttachment extends Date {
- public String toString(){
- return "Hello World";
- }
- }</span>
test测试:
- <span style="font-size:18px;">public static void main(String[] args) throws Exception{
- Class clazz = new MyClassLoader("itmlib").loadClass("com.itm.one.ClassLoaderAttachment");
- // 为何 用父类Date 而不用 ClassLoaderAttachment
- Date d1 = (Date)clazz.newInstance();
- System.out.println(d1);
- }</span>