发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

可编程的编译器

2009-12-24 10:46
赞助商链接

Java通过反射机制可以动态加载一个编译好的类,那么能否直接加载源码类呢?Java 6的javax.tools包提供了在运行时刻,对Java源码编译等功能。可用于:
1. 在文件服务器上生成一个Java文件,然后编译它。
2. 编译Java文件,然后生成一个Jar文件,如果这个Jar文件在classpath中,我们是否可动态加载这个Jar呢?
3. 编写自己的IDE工具。

详细使用见文章:Programmatic Compilation with Java

以下是案例代码:

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;

import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;
import sun.tools.java.ClassFile;

public class CodeCompiler {

public static void main(String[] args) {
try{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(
null, null, null);
Iterable compilationUnits1 = fileManager
.getJavaFileObjects("D:\\TestClass.java");
CompilationTask task = compiler.getTask(null, fileManager, null, null,
null, compilationUnits1);

// Perform the compilation task.
task.call();
fileManager.close();
ClassFile cf = new ClassFile(new File(
"TestClass.class"));
validateDefaultMethods(cf);

}catch(IOException ioe){
ioe.printStackTrace();
}
}

protected static void validateDefaultMethods(ClassFile clazzInfo) {
boolean hasEquals = false;
boolean hasHashCode = false;
boolean hasToString = false;
for (Method method : clazzInfo.getClass().getMethods()) {
String methodName = method.getName();
Class[] types = method.getParameterTypes();
if (
"equals".equals(methodName) && types.length == 1) {
if (
"java.lang.Object".equals(types[0])) {
hasEquals = true;
}
} else if (
"hashCode".equals(methodName) &&
types.length == 0) {
hasHashCode = true;
}else if(
"toString".equals(methodName)&&
types.length == 0){
hasToString = true;

}
}
if(hasEquals&&hasHashCode&&hasToString){
System.out.println(
"Valid Code");
}else{
System.out.println(
"Invalid Code");
}
}

}

1

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com