> testClass = null; try { testClass = classLoader.loadClass("com.neo.classloader.Test2"); Object object = testClass.newInstance(); System.out.println(object.getClass().getClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }}
自定义类加载器的核心在于对字节码文件的获取 , 如果是加密的字节码则需要在该类中对文件进行解密 。由于这里只是演示 , 我并未对class文件进行加密 , 因此没有解密的过程 。这里有几点需要注意:
1、这里传递的文件名需要是类的全限定性名称 , 即com.paddx.test.classloading.Test格式的 , 因为 defineClass 方法是按这种格式进行处理的 。
2、最好不要重写loadClass方法 , 因为这样容易破坏双亲委托模式 。
3、这类Test 类本身可以被 AppClassLoader 类加载 , 因此我们不能把 com/paddx/test/classloading/Test.class 放在类路径下 。否则 , 由于双亲委托机制的存在 , 会直接导致该类由AppClassLoader 加载 , 而不会通过我们自定义类加载器来加载 。
推荐阅读
- 人工智能算法是如何从数据中学习规律的
- 提高 JavaScript 性能的 12 个技巧
- 汽车淹了怎么办 汽车淹水熄火怎么办
- 解密电商系统架构发展历程
- 螃蟹要倒过来蒸吗 螃蟹蒸的时候要翻过来吗
- 只要10分钟,教你配置出炫酷的数据可视化大屏
- PHP五十个提升执行效率的小技巧,和常见问题
- 超详细的MySQL数据库字符集总结
- Python pip的自动更新升级失败问题解决方案
- 全面解析下Spring Boot操作Redis的几种方案