java类加载机制

很早很早之前,我有一个奇怪的想法,就比如说一部电影,他最后可以存储到电脑中,那么他只要能存储到电脑上,它其实就是一堆0和1,因为计算机只能识别0和1,所以,我们能不能,通过计算机,以某种方式,把这堆0和1给生成出来,那么,这个电影是不是以后不用拍了,直接在计算机上生成就可以了,当然,怎么生成的这个办法,我还没想好,哈哈,好奇怪的想法。

java类加载机制,

java默认有三个类加载器

  1 BoopStrap ClassLoader(启动类加载器)

  2 ExtClassLoader(扩展类加载器)

  3 AppClassLoader(应用程序类加载器)

顾名思义,就是加载自己相应的类

自定义类加载器是自己定义的,一般我们都不用写类加载器的,直接用AppClassLoader这个类加载器,如果自己定义类加载器了,那证明已经接触到一些稍微高级的点的东西了。

下面展示一个自定义类加载器,它加载了一个在项目之外的类,通过反射调用了它的方法。

ClassLoaderTestTwo 类 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ClassLoaderTestTwo {
    public static void main(String[] args)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException {
        ClassLoader myLoader = new ClassLoader() {
            @Override
            public Class<?> loadClass(String name) throws ClassNotFoundException {
                String fileName = "";
                InputStream is;
                try {
                    fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
                    System.out.println(fileName);
                    is = new FileInputStream("C:\\classloader\\" + fileName);

                    if (is == null) {
                        return super.loadClass(name);
                    }
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    return defineClass(name, b, 0, b.length);
                } catch (IOException e) {
                    try {
                        is = getClass().getResourceAsStream(fileName);
                        if (is == null) {
                            return super.loadClass(name);
                        }
                        byte[] b;
                        b = new byte[is.available()];
                        is.read(b);
                        return defineClass(name, b, 0, b.length);
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
                return null;
            }
        };
        Class obj = myLoader.loadClass("Hello");
        Object newInstance = obj.newInstance();
        for (int i = 0; i < obj.getMethods().length; i++) {
            System.out.println(obj.getMethods()[i].getName());

        }
        obj.getMethod("test1").invoke(newInstance); // 调用方法

    }
}
Hello类 放在C:\\classloader\\目录下
public class Hello{
    public static void main(String[]args){
        System.out.println("Hello");
    }
    public static void test(){
        System.out.println("Hello");
    }
    public static void test1(){
        System.out.println("test1");
    }
}
posted @ 2020-01-20 10:48  朗先生  阅读(179)  评论(0编辑  收藏  举报