public class MyClassLoader extends ClassLoader{
String path;//自定义类加载器所负责的文件夹
public MyClassLoader(String path) {
super();
this.path = path;
}
@SuppressWarnings("deprecation")
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
//通过 文件输入流 读取 指定的class文件
String file = path+"/"+name+".class";
System.out.println(file);
try {
FileInputStream fis = new FileInputStream(file);
//将读取的class文件对应的 字节数据 写入到内存中
ByteArrayOutputStream out = new ByteArrayOutputStream();
int i = 0;
while ((i = fis.read())!=-1) {
out.write(i);
}
fis.close();
byte[] buf = out.toByteArray();//提取 写到内存中的字节数据到数组
// public byte[] toByteArray()创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
return defineClass(buf, 0, buf.length);
} catch (Exception e) {
e.printStackTrace();
}
return super.findClass(name);
}
}
测试类
public class MyCLassLoaderTest {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) throws Exception {
System.out.println("需要加载的class文件所在文件夹的路径:");
String path = in.nextLine();// 需要加载的class文件的父路径
System.out.println("需要加载的class文件的文件名:");
String name = in.nextLine();
Class clazz = new MyClassLoader(path).loadClass(name);
//执行加载的class文件的main方法
// Method met = clazz.getMethod("main", String[].class);
// System.out.println(met.toString());
// met.invoke(null, (Object)new String[]{});
// 通过自定义类加载器 加载任意目录下的指定class文件
Class clazz2 = new MyClassLoader(path).loadClass(name);
System.out.println("\r\n--------------列出该class恩件中的所有构造方法==========");
Constructor[] cons = clazz2.getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor.toString());
}
System.out.println("---------------列出该class恩件中的所有putong方法。。....。。");
Method[] methods = clazz2.getMethods();
for (Method method : methods) {
System.out.println(method.toString());
}
}
}
//F:\java30\d24
//MyIEbyGUI
转载于:https://blog.51cto.com/jiangzuun2014/1533979