zoukankan      html  css  js  c++  java
  • 自定义ClassLoader,编译并加载外部java文件

    /**

    * java文件: Test.java,  package: com.chenyf.entity,  所在目录:F:/today/javadir/src/main/java/com/chenyf/entity/Test.java

    */

    /**
    * 编译java文件,并加载其Class的工具
    * dirPath: 不含包目录的java文件所在目录, F:/today/javadir/
    * pakagePath: 包路径,com.chenyf.entity
    */

    public static Class getClassFromJavaFile(String dirPath, String pakagePath) {
        if  (StringUtils.isBlank(dirPath) || StringUtils.isBlank(pakagePath))  //校验参数是否为空
    return null;

    String pakageDir = pakagePath.replaceAll("\.","/");  // 将路径中的 . 替换为 / , 替换后的pakageDir = com/chenyf/entity
    String filePath = dirPath.concat( "/src/main/java/" ).concat( pakageDir ).concat(".java");  // src/main/java为java文件的特定目录

    //编译
    JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
    int compilationResult = javac.run(null, null, null, filePath);

    if (compilationResult != 0)  //compilationResult == 0,说明编译成功,在Java文件的同目录下会生成相应的class文件
    throw new IllegalArgumentException("编译失败");

    Class<?> clazz = null;
    try {

    MyClassLoader loader = new MyClassLoader(dirPath);  //使用自定义ClassLoader
    clazz = loader.findClass(pakagePath);

    } catch (Exception e) {
    e.printStackTrace();
    throw e;
    }
    return clazz
    }

    /**
    *自定义ClassLoader
    */
    private static final class MyClassLoader extends ClassLoader {

    private String classDir;  // 文件目录,例如:"file:/today/javadir/src/main/java/"
        @Override
    public Class<?> findClass(String name) {
    String realPath = classDir + name.replace(".","/") + ".class";  //class文件的真实路径
    byte[] cLassBytes = null;
    Path path = null;

    try {

    path = Paths.get(new URI(realPath));  
    cLassBytes = Files.readAllBytes(path);

    } catch (IOException | URISyntaxException e) {
    e.printStackTrace();
    }
    Class clazz = defineClass(name, cLassBytes, 0, cLassBytes.length);  //调用父类的defineClass方法
    return clazz;
    }

    public MyClassLoader(String classDir) {
    this.classDir = "file:/".concat(classDir).concat("/src/main/java/");  //拼接 “file:/”前缀
    }

    }
    听说学习能够让青春永驻。
  • 相关阅读:
    【转贴】SMP、NUMA、MPP体系结构介绍
    【转贴】内存重要参数详解 RAS CAS
    【转贴】内存系列二:深入理解硬件原理
    [百度]将ftp添加到本地映射磁盘的方法
    [百家号]7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz
    CISCO系列交换机如何清空配置
    绝对实用 NAT + VLAN +ACL管理企业网络
    思科 vlan 相关操作
    思科路由器的密码忘记了用简单的命令来重置思科路由器密码
    字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke
  • 原文地址:https://www.cnblogs.com/chenyf/p/10246154.html
Copyright © 2011-2022 走看看