一、编写自定义类加载器类
package com.mybatis.entity;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* 自定义类加载器
* @author dgw
*
*/
public class MyClassLoader extends ClassLoader{
public Class> getClass(String name) throws ClassNotFoundException {
byte[] data=null;
try {
data = this.loadNetClassFile(name);
} catch (Exception e) {
e.printStackTrace();
}
return super.defineClass(name, data, 0, data.length);
}
/**
* 从磁盘加载
* @param name
* @return
* @throws Exception
*/
public byte[] loadClassFile(String name) throws Exception{
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
String filePath = "D:"+File.separator+fileName;
File file=new File(filePath);
InputStream input=new FileInputStream(file);
ByteArrayOutputStream baos = inputStreamToBytes(input);
return baos.toByteArray();
}
/**
* 从网络加载
* @param name
* @return
* @throws Exception
*/
public byte[] loadNetClassFile(String name) throws Exception{
String fileName = name.substring(name.lastIndexOf(".")+1)+".class";
URL url=new URL("http://localhost:8080/"+fileName);
URLConnection openConnection = url.openConnection();
InputStream input=openConnection.getInputStream();
ByteArrayOutputStream baos = inputStreamToBytes(input);
return baos.toByteArray();
}
private ByteArrayOutputStream inputStreamToBytes(InputStream input) throws IOException {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//必须定义byte数组才能使用InputStream
byte[] data=new byte[1024];
int len=0;//读取的个数
while((len=input.read(data))!=-1){
baos.write(data,0,len);
}
input.close();
baos.close();
return baos;
}
}
二、编写测试类
package com.mybatis.entity;
/**
* 自定义类加载器测试类
* @author dgw
*
*/
public class TestMyClassLoader {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
MyClassLoader load=new MyClassLoader();
Class> clazz = load.getClass("com.love.mapper.User");
Object newInstance = clazz.newInstance();
System.out.println(newInstance);
}
}
三、需要加载的类User类
package com.love.mapper;
public class User {
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "自定义类加载器加载类,User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
四、把测试类放到本地磁盘D盘
五、把此时类User.class放到tomcat根目录root下面
六、测试效果图