Java是动态语言吗?JavaCompiler实现动态编译,并通过反射赋值

本文探讨了Java是否属于动态语言的问题,并详细介绍了如何利用JavaCompiler进行动态编译,包括创建Java源文件、编译成class字节码、打包成jar,以及通过反射进行对象赋值。此外,还展示了如何执行cmd命令、动态加载外部jar包,并提供了相关代码示例,如SpringBoot中动态编译工程内存在的bean。
摘要由CSDN通过智能技术生成

主要体现在ClassLoader的loadClass()方法中,思路很简单:先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用启动类加载器作为父类加载器。如果父类加载器加载失败,抛出ClassNotFoundException异常后,调用自己的findClass()方法进行加载。

四、JavaCompiler动态编译


使用JavaCompiler进行动态编译。

//使用ToolProvider.getSystemJavaCompiler来得到一个JavaCompiler接口的实例。

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

//JavaCompiler中最核心的方法是run()。通过这个方法能编译java源代码。

int run(InputStream in, OutputStream out, OutputStream err, String… arguments)

参数分别用来为:

  1. java编译器提供参数

  2. 得到Java编译器的输出信息

  3. 接收编译器的错误信息,

  4. 一个或多个Java源程式文件

如果run编译成功,返回  0。

如果前3个参数传入的是null,那么run方法将以标准的输入、输出代替,即System.inSystem.outSystem.err。如果我们要编译一个test.java文件,并将使用标准输入输出,run的使用方法如下:

int results = tool.run(null, null, null, “D:\test\Student.java”);

五、通过URLClassLoader加载程序外的jar包,并进行动态编译


1、实体类Student

package com.guor.bean;

public class Student {

public Integer id;

public String name;

public void hello(String param) {

System.out.println(param);

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return “Student [id=” + id + “, name=” + name + “]”;

}

}

2、Java文件 -> class -> jar -> 动态编辑 -> 反射赋值

private void test01() throws Exception {

final String javaPath = “D:\test\java”;

final String studentPath = javaPath + “\Student.java”;

final String jarPath = “D:\test\jar\student-1.0.0.jar”;

final String packageStudentPath = “com.guor.bean.Student”;

// 将java源文件编译成.class字节码文件

String cmd = "javac " + studentPath;

System.out.println(cmd);

boolean execSysCmd = execCmd(cmd);

System.out.println(execSysCmd);

// 打成jar包

cmd = "jar -cvf " + jarPath + " " + javaPath;

System.out.println(cmd);

execSysCmd = execCmd(cmd);

System.out.println(execSysCmd);

/**

  • URLClassLoader:继承自SecureClassLoader,支持从jar文件和文件夹中获取class,

  • 继承于classload,加载时首先去classload里判断是否由bootstrap classload加载过

*/

URL url = new URL(“file:” + jarPath);

URLClassLoader classLoader = new URLClassLoader(new URL[] { url },

Thread.currentThread().getContextClassLoader());

CusCompiler compiler = new CusCompiler(classLoader);

File file = new File(studentPath);<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值