您的位置:首页 > 编程语言 > Java开发

Java之------类加载器(二)

2016-05-07 16:02 537 查看
做自己的类加载器

虚拟机的核心是通过类加载器来加载.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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: