• 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");
        }
    }
  • 相关阅读:
    VUE学习一,安装及Hello World
    609. 在系统中查找重复文件
    451. 根据字符出现频率排序
    面试题 10.02. 变位词组
    142. 环形链表 II
    面试题 16.24. 数对和
    151. 翻转字符串里的单词
    1207. 独一无二的出现次数
    80. 删除排序数组中的重复项 II
    1365. 有多少小于当前数字的数字
  • 原文地址:https://www.cnblogs.com/langxiansheng/p/12217024.html
Copyright © 2020-2023  润新知