NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
欢迎关注我的公众号: ![我的公众号](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png) ## 1、定义 Test.java ~~~ public class Test { public void hello(){ System.out.println("我是由 "+getClass().getClassLoader().getClass()+" 加载的"); } } ~~~ ## 2、编译,拷贝出 Test.class,删除 Test.java 待`Test.java`编译后,请把`Test.class`文件拷贝走,再将`Test.java`删除。因为如果`Test.class`存放在当前项目中,根据双亲委派模型可知,会通过`sun.misc.Launcher$AppClassLoader` 类加载器加载。为了让我们自定义的类加载器加载,我们把Test.class文件放入到其他目录。 ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190630145722.png) ## 3、自定义类加载器 ~~~ public class MainClassLoader { public static void main(String[] args) throws Exception { MyClassLoader myClassLoader = new MyClassLoader("/Users/sean/workspace/personal/java/github/JavaPractice/src/"); Class clazz = myClassLoader.loadClass("classloader.Test"); Object obj =clazz.newInstance(); Method method = clazz.getMethod("hello",null); method.invoke(obj,null); } static class MyClassLoader extends ClassLoader { private String classPath; public MyClassLoader(String classPath) { this.classPath = classPath; } private byte[] loadByte(String name) throws IOException { name = name.replace(".", "/"); FileInputStream fileInputStream = new FileInputStream(classPath + "/"+name + ".class"); int len = fileInputStream.available(); byte[] data = new byte[len]; fileInputStream.read(data); fileInputStream.close(); return data; } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { try { byte[] data = loadByte(name); return defineClass(name, data, 0, data.length); } catch (IOException e) { e.printStackTrace(); } return super.findClass(name); } } } ~~~ 结果: ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190630151614.png) [参考地址](https://www.jianshu.com/p/acc7595f1b9d)