自定义ClassLoader
2019-08-16 10:53:53来源:博客园 阅读 ()
自定义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
原文链接:https://www.cnblogs.com/sunzhongyu008/p/11222789.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- JAVA自定义注解 2020-06-01
- 自定义ClassLoader 2020-05-28
- 自定义持久层框架设计实现思路 2020-05-27
- 自定义Spring Boot starter 2020-05-25
- java学习心得——Quartz 自定义定时器的操作 2020-05-20
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash