1. 程式人生 > 其它 >java自定義類載入器

java自定義類載入器

技術標籤:javajavajvm

一、被載入的測試類

1.將被載入的測試類放到d盤test目錄下,然後其他子目錄按照測試的包名建立,完整路徑值這樣的:D:\test\com\example\jvm\demo

2.測試類如下:

package com.example.jvm.demo;

import java.io.PrintStream;

public class Hello
{
  public void show()
  {
    System.out.println("hello");
  }
}

二、自定義載入器

自定義類載入器,主要是重寫ClassLoader中的findClass方法;因為當所有的類載入器都載入不到class檔案時,就要呼叫findClass方法,而ClassLoader中的findClass方法是直接拋異常的,所以需要重寫findClass方法載入我們制定的檔案,程式碼如下:

  protected Class<?> findClass(String name) throws ClassNotFoundException {
        throw new ClassNotFoundException(name);
    }

自定義的類載入器:

package com.example.jvm.demo;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;

public class JVM_002_ClassLoader extends ClassLoader {

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        File file = new File("d:/test/"+name.replace(".","/").concat(".class"));
        ByteArrayOutputStream  baos = new ByteArrayOutputStream();
        try  {
            FileInputStream fis = new FileInputStream(file);

            int b = 0;
            while((b = fis.read()) != -1) {
                baos.write(b);
            }
            byte[] bytes = baos.toByteArray();
            baos.close();
            fis.close();
            return defineClass(name,bytes,0,bytes.length);
        }catch (IOException e){
            e.printStackTrace();
        }

        return super.findClass(name);

    }

    public static void main(String[] args) throws Exception{
        ClassLoader l = new JVM_002_ClassLoader();
        Class<?> aClass = l.loadClass("com.example.jvm.demo.Hello");
        Object o = aClass.newInstance();
        Method method = aClass.getMethod("show");
        method.invoke(o);


    }
}

三、測試結果