zoukankan      html  css  js  c++  java
  • 自定义ClassLoader

    1.  将Message.java拷贝到 /Users/sunny/test目录下(和NVIDIAClassLoader类MESSAGE_CLASS_PATH指定的路径一致),并编译生成字节码文件(.class)。

    Message.java:
    1 package com.nvidia.util;
    2 
    3 public class Message {
    4     public void send() {
    5         System.out.println("www.nvidia.com");
    6     }
    7 }

    2.编写自定义ClassLoader类。

    NVIDIAClassLoader.java:
     1 package com.nvidia.util;
     2 
     3 import java.io.ByteArrayOutputStream;
     4 import java.io.File;
     5 import java.io.FileInputStream;
     6 import java.io.InputStream;
     7 
     8 public class NVIDIAClassLoader extends ClassLoader{
     9     private static final String MESSAGE_CLASS_PATH = File.separator +"Users" + File.separator + "sunny" + File.separator + "test" + File.separator+"Message.class";
    10     public Class<?> loadData(String className) throws Exception{
    11         byte[] data = this.loadClassData();
    12         if(data != null) {
    13             return super.defineClass(className, data, 0, data.length);
    14         }
    15         return null;
    16     }
    17     private byte[] loadClassData() throws Exception{
    18         InputStream input = null;
    19         ByteArrayOutputStream bos = null;
    20         byte data[] = null;
    21         try {
    22             bos = new ByteArrayOutputStream();
    23             input = new FileInputStream(new File(MESSAGE_CLASS_PATH));
    24             input.transferTo(bos);
    25             data = bos.toByteArray();
    26         } catch (Exception e) {
    27             e.printStackTrace();
    28         }finally {
    29             if(input != null) {
    30                 input.close();
    31             }
    32             if(bos != null) {
    33                 bos.close();
    34             }
    35         }
    36         return data;
    37     }
    38 }

    3.测试类。

    JavaReflectDemo:
     1 package com.nvidia.demo;
     2 
     3 import com.nvidia.util.NVIDIAClassLoader;
     4 import java.lang.reflect.Method;
     5 
     6 public class JavaReflectDemo {
     7     public static void main(String[] args) throws Exception {
     8         NVIDIAClassLoader classloader = new NVIDIAClassLoader();
     9         Class<?> cls = classloader.loadData("com.nvidia.util.Message");
    10         //System.out.println(cls);
    11         Object object = cls.getDeclaredConstructor().newInstance();
    12         Method method = cls.getDeclaredMethod("send");
    13         method.invoke(object);
    14         System.out.println(cls.getClassLoader());
    15         System.out.println(cls.getClassLoader().getParent());
    16         System.out.println(cls.getClassLoader().getParent().getParent());
    17     }
    18 }

    运行结果:

    www.nvidia.com
    com.nvidia.util.NVIDIAClassLoader@5451c3a8
    jdk.internal.loader.ClassLoaders$AppClassLoader@55054057
    jdk.internal.loader.ClassLoaders$PlatformClassLoader@2c7b84de
  • 相关阅读:
    Linux内核之 I/O多路复用
    Linux内核之 页高速缓存与页回写
    Linux内核之 块I/O层及I/O调度
    Linux内核之 文件I/O
    C++雾中风景15:聊聊让人抓狂的Name Mangling
    音频数据增强及python实现
    深度学习中“过拟合”的产生原因和解决方法
    资料-资源(不定期更新)
    论文翻译:2020_Acoustic Echo Cancellation Challenge Datasets And Testingframework
    语音信号处理概念
  • 原文地址:https://www.cnblogs.com/sunzhongyu008/p/11222789.html
Copyright © 2011-2022 走看看