java编译类_如何以编程方式编译和实例化Java类?

如何加载未编译的Java类?

您需要先编译它。可以编程方式使用javax.toolsAPI..这只需要JDK安装在JRE之上的本地机器上。

下面是一个基本的启动示例(将明显的异常处理放在一边):// Prepare source somehow.String source = "package test; public class Test { static { System.out.println(\"hello\");

} public Test() { System.out.println(\"world\"); } }";// Save source in .java file.File root = new File("/java");

// On Windows running on C:\, this is C:\java.File sourceFile = new File(root, "test/Test.java");

sourceFile.getParentFile().mkdirs();Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));

// Compile source file.JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();compiler.run(null, null, null, sourceFile.getPath());

// Load and instantiate compiled class.URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });

Class> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".Object instance = cls.newInstance();

// Should print "world".System.out.println(instance); // Should print "test.Test@hashcode".

会产生这样的结果hello

world

test.Test@ab853b

如果这些类更容易使用,则更容易使用。implements已经在类路径中的某个接口。SomeInterface instance = (SomeInterface) cls.newInstance();

否则,您需要让反射API访问和调用(未知)方法/字段。

这与实际问题无关:properties.load(new FileInputStream(new File("ClassName.properties")));

放任java.io.File依赖当前的工作目录是解决可移植性问题的良方。别干那事。将该文件放入类路径并使用ClassLoader#getResourceAsStream()有一条类路径-相对路径。properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("ClassName.properties"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值