import java.io.*;
public class MyClassLoader extends ClassLoader{
private String loaderName; //类加载器名称
private String path = "";
private final String fileType = ".class";
public MyClassLoader(String name){
super();
this.loaderName = name;
}
public MyClassLoader(ClassLoader parent,String name){
super(parent);
this.loaderName = name;
}
public String getPath(){return this.path;}
public void setPath(String path){this.path = path;}
@Override
public String toString(){return this.loaderName;}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException{
byte[] data = loaderClassdata(name);
return this.defineClass(name, data, 0, data.length);
}
private byte[] loaderClassdata(String name){
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream bouts = new ByteArrayOutputStream();
try {
is = new FileInputStream(new File(path + name + fileType));
int c = 0;
while(-1 != (c = is.read())){
bouts.write(c);
}
data = bouts.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(is != null)
is.close();
if(bouts != null)
bouts.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
}
}
自定义类加载器,也就是从java自身类库的ClassLoader继承一个类出来;
然后在程序中使用; 下面代码需要包含 java.lang.reflect.Field和Method;
加载在目录下已经存在的test1.class;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class client {
public static void main(String[] args) {
MyClassLoader myCLoader = new MyClassLoader("MyClassLoader");
myCLoader.setPath("S:\\43\\javaprj\\");
Class<?> clazz;
try {
clazz = myCLoader.loadClass("test1");
Field[] filed = clazz.getFields(); //获取加载类的属性字段
Method[] methods = clazz.getMethods(); //获取加载类的方法字段
System.out.println("该类的类加载器为:" + clazz.getClassLoader());
System.out.println("该类的类加载器的父类为:" + clazz.getClassLoader().getParent());
System.out.println("该类的名称为:" + clazz.getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行如下;
只是加载自己的class,没有干其他;