mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
@@ -0,0 +1,42 @@
|
||||
package cn.hutool.core.compiler;
|
||||
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import cn.hutool.core.util.ZipUtil;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Java源码编译器测试
|
||||
*
|
||||
* @author lzpeng
|
||||
*/
|
||||
public class JavaSourceCompilerTest {
|
||||
|
||||
/**
|
||||
* 测试编译Java源码
|
||||
*/
|
||||
@Test
|
||||
public void testCompile() throws ClassNotFoundException {
|
||||
final File libFile = ZipUtil.zip(FileUtil.file("lib.jar"),
|
||||
new String[]{"a/A.class", "a/A$1.class", "a/A$InnerClass.class"},
|
||||
new InputStream[]{
|
||||
FileUtil.getInputStream("test-compile/a/A.class"),
|
||||
FileUtil.getInputStream("test-compile/a/A$1.class"),
|
||||
FileUtil.getInputStream("test-compile/a/A$InnerClass.class")
|
||||
});
|
||||
final ClassLoader classLoader = JavaSourceCompiler.create(null)
|
||||
.addSource(FileUtil.file("test-compile/b/B.java"))
|
||||
.addSource("c.C", FileUtil.readUtf8String("test-compile/c/C.java"))
|
||||
.addLibrary(libFile)
|
||||
.compile();
|
||||
final Class<?> clazz = classLoader.loadClass("c.C");
|
||||
Object obj = ReflectUtil.newInstance(clazz);
|
||||
Assert.assertTrue(String.valueOf(obj).startsWith("c.C@"));
|
||||
FileUtil.del(libFile);
|
||||
}
|
||||
|
||||
}
|
BIN
hutool-core/src/test/resources/test-compile/a/A$1.class
Normal file
BIN
hutool-core/src/test/resources/test-compile/a/A$1.class
Normal file
Binary file not shown.
BIN
hutool-core/src/test/resources/test-compile/a/A$InnerClass.class
Normal file
BIN
hutool-core/src/test/resources/test-compile/a/A$InnerClass.class
Normal file
Binary file not shown.
BIN
hutool-core/src/test/resources/test-compile/a/A.class
Normal file
BIN
hutool-core/src/test/resources/test-compile/a/A.class
Normal file
Binary file not shown.
24
hutool-core/src/test/resources/test-compile/a/A.java
Normal file
24
hutool-core/src/test/resources/test-compile/a/A.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package a;
|
||||
|
||||
import cn.hutool.core.lang.ConsoleTable;
|
||||
import cn.hutool.core.lang.caller.CallerUtil;
|
||||
|
||||
public class A {
|
||||
private class InnerClass {
|
||||
}
|
||||
|
||||
public A() {
|
||||
new InnerClass() {{
|
||||
int i = 0;
|
||||
Class<?> caller = CallerUtil.getCaller(i);
|
||||
final ConsoleTable t = new ConsoleTable();
|
||||
t.addHeader("类名", "类加载器");
|
||||
System.out.println("初始化 " + getClass() + " 的调用链为: ");
|
||||
while (caller != null) {
|
||||
t.addBody(caller.toString(), caller.getClassLoader().toString());
|
||||
caller = CallerUtil.getCaller(++i);
|
||||
}
|
||||
t.print();
|
||||
}};
|
||||
}
|
||||
}
|
BIN
hutool-core/src/test/resources/test-compile/b/B.class
Normal file
BIN
hutool-core/src/test/resources/test-compile/b/B.class
Normal file
Binary file not shown.
8
hutool-core/src/test/resources/test-compile/b/B.java
Normal file
8
hutool-core/src/test/resources/test-compile/b/B.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package b;
|
||||
import a.A;
|
||||
|
||||
public class B {
|
||||
public B() {
|
||||
new A();
|
||||
}
|
||||
}
|
BIN
hutool-core/src/test/resources/test-compile/c/C.class
Normal file
BIN
hutool-core/src/test/resources/test-compile/c/C.class
Normal file
Binary file not shown.
9
hutool-core/src/test/resources/test-compile/c/C.java
Normal file
9
hutool-core/src/test/resources/test-compile/c/C.java
Normal file
@@ -0,0 +1,9 @@
|
||||
package c;
|
||||
|
||||
import b.B;
|
||||
|
||||
public class C {
|
||||
public C() {
|
||||
new B();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user