Java之------类加载器(二)
2016-05-07 16:02
537 查看
做自己的类加载器
虚拟机的核心是通过类加载器来加载.class文件,然后进行相应的解析执行。那么我们可以自己做类加载器,手动加载需要的.class以进行解析执行,从而扩展虚拟机的功能。
以下内容摘自API文档:
应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式。
网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。
示例:
先写一个Person类用于操作
虚拟机的核心是通过类加载器来加载.class文件,然后进行相应的解析执行。那么我们可以自己做类加载器,手动加载需要的.class以进行解析执行,从而扩展虚拟机的功能。
以下内容摘自API文档:
应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式。
网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类。下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例。
示例:
先写一个Person类用于操作
package cn.hncu; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } }再写MyClassLoader
package cn.hncu; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import org.junit.Test; public class MyClassLoader extends ClassLoader{ @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte buf[]=loadClassData(name); Class c=defineClass("cn.hncu.Person",buf, 0, buf.length);//defineClass()方法只能在非静态方法中使用 return c; } private byte[] loadClassData(String name) { byte buf[]=new byte[1024]; try { InputStream in=new FileInputStream(name); ByteArrayOutputStream baos=new ByteArrayOutputStream(); int len=0; while ((len=in.read(buf))!=-1){ baos.write(buf,0,len); } baos.close(); byte b[]=baos.toByteArray(); return b; } catch (Exception e) { e.printStackTrace(); } return null; } @Test public void testMyClassLoader() throws Exception{ String className="cn.hncu.Person"; Object obj1=Class.forName(className).newInstance(); System.out.println(obj1); Person p1=(Person) obj1; System.out.println(p1); System.out.println("--------------------"); className="d:\\a\\cn\\hncu\\Person.class"; Object obj2=findClass(className).newInstance(); System.out.println(obj2); } }
相关文章推荐
- 转自:Java通过SMS短信平台实现发短信功能
- maven项目 加入json-lib-2.2.3-jdk15.jar 报错 Missing artifact net.sf.json-lib:json-lib:jar:2.4:compile
- Java线程
- Java基于Socket的简单推送
- java单例模式详解
- java代码获取各种时间
- Google Java 编程风格指南 —— 见微知著
- JAVA泛型中? T K V E等代表的意思
- 【Leetcode】:326. Power of Three 问题 in JAVA
- Spring hibernatecallback学习
- java double类型保留两位小数4种方法
- JAVA面向对象API————List的子类特点概述
- 手把手教你如何搭建本地的 Java API 文档
- java中关于try、catch、finally中的细节分析
- java第六次作业
- Java获取随机数的3种方法
- 一个在java运行时利用反射动态调用方法的例子
- MyEclipse中为struts项目添加和使用多个Struts-Config配置文件
- Java 中 String 的常用方法(一)
- struts2与ognl结合实现下载