快速业务通道

探索Eclipse的ASTParser - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
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 实现非常简单,并假设所有的类依赖 性都已经在当前的类加载器中加载了。真正的实现可能需要其他自定义类加载器,该加载 器将搜索为编译提供的某些类路径。

此外可能还需

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号