1.java 读取类文件并加载到JVM中
package com.test.dog.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/**
*
* @author LiuQing
* @see 类安全加载类
* @version 1.0
* @date 2011-10-01
*
*/
public class SecurityClassLoader extends ClassLoader {
private String rootDir;
/**
* @see 重写find 单类加载器
* @param name String
* @return Class<?>
*/
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] clazzData = this.getData(name);
if (clazzData == null) {
throw new ClassNotFoundException();
}
else {
return this.defineClass(name, clazzData, 0, clazzData.length);
}
}
/**
* @see 加载数据类型
* @param clazzName String
* @return byte[]
*/
public byte[] getData(String clazzName) {
String filePath = this.getPath(clazzName);
InputStream input = null;
ByteArrayOutputStream byteOutput = null;
try {
input = new FileInputStream(filePath);
byteOutput = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
while (true) {
int len = input.read(buffer);
if (len == -1) {
break;
}
byteOutput.write(buffer, 0, len);
}
}
catch (Exception e) {
e.printStackTrace();
}
return byteOutput.toByteArray();
}
/**
* 设置类加载路径
* @param clazzName String
* @return String
*/
public String getPath(String clazzName) {
return this.rootDir + File.separator + clazzName.replace('.', File.separatorChar) + ".cer";
}
/**
* @see 设置加载类路
* @return String
*/
public String getRootDir() {
return rootDir;
}
/**
* @see 设置加载类路
* @param rootDir String
*/
public void setRootDir(String rootDir) {
this.rootDir = rootDir;
}
}
2.测试例子
SecurityClassLoader s1 = new SecurityClassLoader();
s1.setRootDir("D:\\jdk1.6.0_13\\jdk1.6.0_13\\bin");
Class<?> clazzOne = s1.loadClass("comtest.usbm.Test");
Object obj = clazzOne.newInstance();
System.out.println(clazzOne + " One");
//定义参数类型
Class<?>[] parameters = new Class[]{String.class};
Method showMethod = clazzOne.getDeclaredMethod("show", parameters);
//定义传入参数值
Object[] objs = new Object[]{"LiuQing"};
showMethod.invoke(obj,objs);
//加载器2
SecurityClassLoader s2 = new SecurityClassLoader();
s2.setRootDir("D:\\jdk1.6.0_13\\jdk1.6.0_13\\bin\\comtest\\usbm");
Class<?> clazzTwo = s2.loadClass("comtest.usbm.Test");
Object objTwo = clazzTwo.newInstance();
System.out.println(obj.toString());
System.out.println(objTwo.toString());
System.out.println(clazzTwo + " Two");
//定义参数类型
Class<?>[] parameters1 = new Class[]{String.class};
Method showMethod1 = clazzTwo.getDeclaredMethod("show", parameters1);
//定义传入参数值
Object[] objs1 = new Object[]{"LiuQing"};
showMethod1.invoke(objTwo,objs1);