自定义类加载器

男娘i 2022-02-19 23:13 450阅读 0赞
  1. package com.jerry.demo.core;
  2. import com.jerry.demo.model.User;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.lang.reflect.Method;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. public class CustomClassLoader extends ClassLoader {
  11. private final static String DEFAULT_LOAD_PATH = "G:\\devOutput\\workspace\\jerry-paas-master\\demo\\target\\classes";
  12. private final String classDir ;
  13. @Override
  14. protected Class<?> findClass(String name) throws ClassNotFoundException {
  15. byte [] classByte = readClassByte(name);
  16. if(null == classByte||classByte.length == 0){
  17. throw new ClassNotFoundException("cannot load this class:" + name);
  18. }
  19. return this.defineClass(name,classByte,0,classByte.length);
  20. }
  21. public CustomClassLoader() {
  22. super();
  23. classDir = DEFAULT_LOAD_PATH;
  24. }
  25. public CustomClassLoader(String classDir) {
  26. super();
  27. this.classDir = classDir;
  28. }
  29. public CustomClassLoader(String classDir,ClassLoader parentClassParent) {
  30. super(parentClassParent);
  31. this.classDir = classDir;
  32. }
  33. private byte[] readClassByte(String className) throws ClassNotFoundException {
  34. className = className.replace(".","\\");
  35. // className = classDir + className;
  36. Path classPath = Paths.get(classDir,className+".class");
  37. if(!classPath.toFile().exists()){
  38. throw new ClassNotFoundException();
  39. }
  40. ByteArrayOutputStream bao = new ByteArrayOutputStream();
  41. try {
  42. Files.copy(classPath, bao);
  43. return bao.toByteArray();
  44. }catch (IOException e){
  45. throw new ClassNotFoundException("加载类出错!");
  46. }
  47. }
  48. public static void main(String[] args) throws Exception {
  49. CustomClassLoader cl = new CustomClassLoader(DEFAULT_LOAD_PATH,CustomClassLoader.class.getClassLoader().getParent());
  50. Class clazz = cl.findClass("com.jerry.demo.model.User");
  51. Method setName = clazz.getDeclaredMethod("setName", new Class[]{String.class});
  52. Object user = clazz.newInstance();
  53. setName.invoke(user,"jerry");
  54. System.out.println(user);
  55. System.out.println(user.getClass().getClassLoader());
  56. System.out.println(user.getClass().getClassLoader().getParent());
  57. }
  58. }

发表评论

表情:
评论列表 (有 0 条评论,450人围观)

还没有评论,来说两句吧...

相关阅读

    相关 定义

    自定义类的的应用场景: 1.加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加载后就不能再用

    相关 定义

    1. 双亲委派模型 1.1 什么是双亲委派模型? 首先,先要知道什么是类加载器。简单说,类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Clas

    相关 定义

    loadClass方法实现了双亲委派模型。 1. 首先,检查一下指定名称的类是否已经加载过,如果加载过了,就不需要再加载,直接返回。 2. 如果此类没有加载过,那么,再判