zoukankan      html  css  js  c++  java
  • 【转载】自定义类加载器例子

    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>

  • 相关阅读:
    Hadoop命令手册
    编程算法
    综合8种子排序算法总结和比较
    android 创建一个新的每次project什么时候 请问自己主动 参加 V7依赖?
    【JDBC】java PreparedStatement操作oracle数据库
    【cocos2dx 加载资源目录】
    Project Euler:Problem 39 Integer right triangles
    矿Java开发学习之旅------>Java排序算法经典的二分法插入排序
    [React Intl] Render Content with Placeholders using react-intl FormattedMessage
    [React Intl] Install and Configure the Entry Point of react-intl
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/4050874.html
Copyright © 2011-2022 走看看