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