iedName());
char[][] packages = new char[names.length][];
for (int i=0;i < names.length; ++i)
packages[i] = names[i].toCharArray();
return packages;
}
public char[] getFileName() {
TypeDeclaration classType = (TypeDeclaration) unit.types().get(0);
String name = classType.getName().getFullyQualifiedName() + ".java";
return name.toCharArray();
}
}
探索Eclipse的ASTParser(7)
时间:2011-04-11 IBM Manoel Marques
检查编译错误
完成编译后,要做的第一件事就是从 ICompilerRequestor 实现中找出各种可能的错误 ,其中包括警告或致命错误。下面是一个例子:
清单 12. 处理编译错误
List problems = requestor.getProblems();
boolean error = false;
for (Iterator it = problems.iterator(); it.hasNext();) {
IProblem problem = (IProblem)it.next();
StringBuffer buffer = new StringBuffer();
buffer.append(problem.getMessage());
buffer.append(" line: ");
buffer.append(problem.getSourceLineNumber());
String msg = buffer.toString();
if(problem.isError()) {
error = true;
msg = "Error:\n" + msg;
}
else
if(problem.isWarning())
msg = "Warning:\n" + msg;
System.out.println(msg);
}
运行编译后的应用程序
如果一切正常,那么就可以实例化这个类并运行其 main 方法了。对 ICompilerRequestor 实现返回的字节码使用反射很容易做到。
清单 13. 运行编译后的应用程序
try {
ClassLoader loader = new CustomClassLoader(getClass().getClassLoader (),
requestor.getResults());
String className = CharOperation.toString(unit.getPackageName()) + "." +
new String(unit.getMainTypeName());
Class clazz = loader.loadClass(className);
Method m = clazz.getMethod("main",new Class[] {String[].class});
m.invoke(clazz,new Object[] { new String[0] });
}
catch (Exception e) {
e.printStackTrace();
}
探索Eclipse的ASTParser(8)
时间:2011-04-11 IBM Manoel Marques
注意我是如何使用自定义的类加载器访问这个类的,该加载器按照请求加载编译后的字 节码。清单 14 给出了一个例子。
清单 14. 自定义的类加载器
static private class CustomClassLoader extends ClassLoader {
private Map classMap;
CustomClassLoader(ClassLoader parent,List classesList) {
this.classMap = new HashMap();
for (int i = 0; i < classesList.size(); i++) {
ClassFile classFile = (ClassFile)classesList.get(i);
String className = CharOperation.toString (classFile.getCompoundName());
this.classMap.put(className,classFile.getBytes());
}
}
public Class findClass(String name) throws ClassNotFoundException {
byte[] bytes = (byte[]) this.classMap.get(name);
if (bytes != null)
return defineClass(name, bytes, 0, bytes.length);
return super.findClass(name);
}
}
这是一个非常简单的编译器。INameEnvironment 实现非常简单,并假设所有的类依赖 性都已经在当前的类加载器中加载了。真正的实现可能需要其他自定义类加载器,该加载 器将搜索为编译提供的某些类路径。
此外可能还需 |