自定义ClassLoader

2019-08-09 00:00:00 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

 

相关文章