自定义ClassLoader,继承ClassLoader,代码:
package testJvm; import java.io.*; /** * @author: Xu Xiang @createTime: 2021/7/14 8:41 * Description: */ public class XuXiangClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { File file = new File("d:/test/", name.replaceAll(".", "/").concat(".class")); try { FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b = 0; // 从文件里读出来,写到字节数组里 while ((b = fis.read()) != 0) { baos.write(b); } // 转换成二进制的字节数组 byte[] bytes = baos.toByteArray(); baos.close(); fis.close(); // 将二进制东西转换成class类对象 return defineClass(name, bytes, 0, bytes.length); } catch (Exception e) { e.printStackTrace(); } return super.findClass(name); } public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException { XuXiangClassLoader xxClassLoader = new XuXiangClassLoader(); Class aClass = xxClassLoader.loadClass("testJvm.Hello"); Hello o = (Hello)aClass.newInstance(); o.hello(); } }
其中,d盘目录下test文件下面的Hello.class的原java代码如下:
package testJvm; /** * @author: Xu Xiang @createTime: 2021/7/14 8:44 * Description: */ public class Hello { public void hello() { System.out.println("hello xuxiang!"); } }
运行main方法:
以上;
原文:https://www.cnblogs.com/xuyinshan/p/15009325.html