• 【转载】自定义类加载器例子


    Test1.java:

    package test;

    import java.io.*;
    import java.lang.reflect.*;

    class AClassLoader extends ClassLoader {
        public Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
            Class klass = null;
            try {
                klass = //检查该类是否已经被装载。
                if (klass != null) {
                    return klass;  
                }
               
                byte[] bs = getClassBytes(name);//从一个特定的信息源寻找并读取该类的字节。
                if (bs != null && bs.length > 0) {
                    klass = defineClass(name, bs, 0, bs.length);  
                }
                if (klass == null) { //如果读取字节失败,则试图从JDK的系统API中寻找该类。
                    klass = findSystemClass(name);
                }
                if (resolve && klass != null) {
                    resolveClass(klass);  
                }
            } catch (IOException e) {
                throw new ClassNotFoundException(e.toString());
            }  
            System.out.println("klass == " + klass);
            return klass;
        }  
        private byte[] getClassBytes(String className) throws IOException {
            String path = System.getProperty("java.class.path") + File.separator;
            path += className.replace('.', File.separatorChar) + ".class";
            System.out.println(path);
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(path);
            } catch (FileNotFoundException e) {
                System.out.println(e);
                return null;
       //如果查找失败,则放弃查找。捕捉这个异常主要是为了过滤JDK的系统API。
            }
            byte[] bs = new byte[fis.available()];
            fis.read(bs);
            return bs;
        }
    }

    public class Test1 {
        public static void main(String[] args) throws Exception{
            AClassLoader loader = new AClassLoader();
            Class c = loader.loadClass("test.A", false);
            System.out.println(c);
            Object o = c.newInstance();
            System.out.println(o);
           
        }  
    }

    A.java

    package test;
    public class A {
        public void print(String str) {
            System.out.println("嗨," + str + ", 你终于找到我了!");  
        }
        public String toString() {
            return "我是一个A对象!";  
        }  
    }

    结果:

    C:/test>javac -d ./bin ./src/*.java

    C:/test>java -classpath ./bin test.Test1
    ./bin/test/A.class
    ./bin/java/lang/Object.class
    java.io.FileNotFoundException: ./bin/java/lang/Object.class (系统找不到指定的路
    径。)

    klass == class java.lang.Object
    klass == class test.A
    class test.A
    我是一个A对象!
    ./bin/java/lang/String.class
    java.io.FileNotFoundException: ./bin/java/lang/String.class (系统找不到指定的路
    径。)
    klass == class java.lang.String
    ./bin/java/lang/System.class
    java.io.FileNotFoundException: ./bin/java/lang/System.class (系统找不到指定的路
    径。)
    klass == class java.lang.System
    ./bin/java/lang/StringBuilder.class
    java.io.FileNotFoundException: ./bin/java/lang/StringBuilder.class (系统找不到指
    定的路径。)
    klass == class java.lang.StringBuilder
    ./bin/java/io/PrintStream.class
    java.io.FileNotFoundException: ./bin/java/io/PrintStream.class (系统找不到指定的
    路径。)
    klass == class java.io.PrintStream

    嗨,bitan, 你终于找到我了!

    C:/test>

  • 相关阅读:
    JavaScript 获得今天的日期 (yy-mm-dd)格式
    web前端筛选页面(类似大众点评)
    JS 获取浏览器的名称和版本信息
    java 接收json数据
    指定配置文件启动mongodb
    linux写一个定时任务
    windows杀死占用端口
    mongodb聚合操作汇总
    jpa常用查询
    idea 更换主题
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/4050874.html
Copyright © 2020-2023  润新知