javaast生成代码 java代码自动生成

java parserjava parser是什么,让我们一起了解一下?
Java Parser是基于JavaCC作为Java语言词法解析的工具,支持Java语言生成AST(Abstract Syntax Tree抽象语法树),在AST基础上进行类型推断分析,支持修改AST从而生成新的Java文件内容 , 支持从Java 1.0到14所有的版本的AST解析 。
AST结构允许以一种简单的编程方式使用Java代码 。可以专门操作Java文件,使用起来也更简单 。它提供了一种方便的机制 , 可以使用我们称为“访客支持”的功能来导航树 。这使开发人员能够专注于在源代码中识别有趣的模式 , 而不必编写费力的树遍历代码 。该库的最终主要功能是能够操纵源代码的基础结构 。然后可以将其写入文件,为开发人员提供构建自己的代码生成软件的便利 。
那么我们使用JavaParser theere时,总是希望进行很多操作 。
例如 , 我们希望对整个项目进行操作,因此在给定目录的情况下,我们将探索所有Java文件 。此类应有助于完成此任务:
package me.tomassetti.support;import java.io.File;public class DirExplorer {public interface FileHandler {void handle(int level, String path, File file);}public interface Filter {boolean interested(int level, String path, File file);}private FileHandler fileHandler;private Filter filter;public DirExplorer(Filter filter, FileHandler fileHandler) {this.filter = filter;this.fileHandler = fileHandler;}public void explore(File root) {explore(0, "", root);}private void explore(int level, String path, File file) {if (file.isDirectory()) {for (File child : file.listFiles()) {explore(level + 1, path + "/" + child.getName(), child);}} else {if (filter.interested(level, path, file)) {fileHandler.handle(level, path, file);}}}}
对于每个Java文件,我们首先要为每个Java文件构建一个抽象语法树(AST),然后对其进行导航 。这样做有两种主要策略:
1、使用访客:要在特定类型的AST节点上进行操作时,这是正确的策略 。
2、使用递归迭代器:这允许处理所有类型的节点 。
JDT的好处是什么?JDT(java development tooling)是Eclipse提供的一组API 。其功能引用其官方文档上的说法:
Programmatically manipulate Java resources, such as creating projects, generating Java source code, performing builds, or detecting problems in code. Programmatically launch a Java program from the platform. Provide a new type of VM launcher to support a new family of Java runtimes. Add new functions and extensions to the Java IDE itself. 总之,提供了一系列强大的API供我们操作Java代码 。
JDT实际上是将Java代码构建成一个基于DOM结构的抽象语法树AST(Abstract Syntax Tree ) 。代码中的每个部分都对应一个ASTNode,许多的ASTNode就构成了这个抽象的语法树 。Java Class一般对应Compilation Unit node,该节点也是AST树上的顶点 。创建一个AST如下:
java 代码
ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource("".toCharArray()); CompilationUnit unit = (CompilationUnit) parser.createAST(null); unit.recordModifications(); AST ast = unit.getAST();
其中createAST,当parse需要较长时间时,可以采用createAST(new NullProgressMonitor()),否则直接传null即可 。
recordModifications()用于记录节点的变动,比如修改、删除等,当需要对AST树进行变动操作时,必须要预先调用这个方法 。
比较重要的是:一个AST树上的所有节点必须都属于该AST 。不允许直接将其他AST树上的节点添加该AST树上 。否则会抛出java.lang.IllegalArgumentException异常 。须使用ASTNode.copySubtree(AST target, ASTNode node)返回一个目标树的深度拷贝 , 才能进行添加操作 。例如: java 代码ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource("".toCharArray()); CompilationUnit targetRoot= (CompilationUnit) parser.createAST(null); targetRoot.recordModifications(); parser.setSource("class T{}”".toCharArray()); CompilationUnit srcRoot= (CompilationUnit) parser.createAST(null); //这是非法操作,两者的AST源不一样 targetRoot.types().add(srcRoot.types().get(0)); //这是合法操作 targetRoot.types().add(ASTNode.copySubtree( targetRoot.getAST(), (ASTNode) srcRoot.types().get(0))); //这是合法操作 targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());
可以查百度百科的
用Java怎么解析C/C++代码生成AST抽象语法树结构其中一个明显的例子是Eclipse CDT里的parser 。
它是完全用Java实现的,手写的递归下降parser,能把C或C++源码parse成AST供Eclipse CDT的IDE功能使用 。它支持C99语法(包括GCC扩展)、C++语法(我没仔细看现在支持到什么版本了)等 。
它并不用于实际的编译(这跟Eclipse JDT里的Eclipse Compiler for Java不同);实际编译还是交给诸如GCC、xlc之类的编译器去完成 。
关于Eclipse CDT里的C与C++ parser的介绍 , 请参考
求教如何使用java编写加壳程序这个问题就需要来谈谈壳的架构问题了 。
壳的三大架构
1.最早的壳几乎都是virus演化来的,大部分都是汇编直接写的 。
好处就是直接可以把汇编代码复制出来当作壳的loader代码添加(感染)到程序上
知名的比如aspack,upx , telock,PESpin
2.随着对于反调试要求越来越高,功能越来越多,代码一多就难以维护 。
于是诞生了新的壳架构,功能采用DLL开发,使用loader来加载
这里有两个变种:
ShellCodeLoader+DLLASProtect 。Themida , ACProtect等等你所熟悉的加密壳绝大部分都是这样的架构
memoryloader+DLLbigfoot为代表的bambam,ZProtect,eXPressor,npack,ChinaProtect等等
这种架构简单,好维护,更好调试 。其实许多其他壳或多或少的都使用这两种架构
3.对于一些纯VM的保护壳,由于没有固定代码(VMProtect等)
所以对于这样的需求首先你需要一个codegen(这个东东将陪伴你写壳的一生)
而且对于codegen其实完全可以构造一个完整的壳代码(调试比较麻烦)
不管什么语言开发的加壳软件最终都要回到opcode操作上,而对于opcode其实用神马语言都差不多
这三种架构介绍完了 。那么谈谈java写壳的问题吧
其实可以简单的从语言优势上来解答:
【javaast生成代码 java代码自动生成】如果说开发第三种壳用啥其实都差不多,Java和C#说不定更有优势 。
上面我们说到codegen的问题,真正不适合开发的地方其实主要是在各种地址转换上面,
反汇编引擎反汇编的都是opcode结构 , 然后再将这些opcode串联起来构造出AST,省下的就是mutation,vm,还是其他等等操作了,
如果单纯为了解决opcode---AST(AbstractSyntaxTree抽象语法树)解决了地址转换这个问题的话其实汇编,C\C++还是Java都差不多 。
反而由于Java和C#这些语言有很好的容器可以更好的来控制对象
opcode生成其实也不是难事,这些用Java还是C++其实都差不多 。
真正的难点就在于上面所说的壳Loader的开发上 , 不管是汇编,C\C++,Delphi(不管在国内外特别是国外其实许多壳都是Delphi开发的)
都可以直接开发DLL , 直接拿来变形后塞进原始程序当作壳的LoaderMain部分 。
而Java就只能从codegen来构造壳代码了 。。。
这是一件很痛苦的事情(相信我~如果你用过Java写过c语言编译器-带连接器的那种你就会明白痛苦了)
综上所述~介于楼主的语言选择问题 , 估计多数是只会Java,或者需要在web层调用 。
那么最好的办法还是壳主体ASM,C\C++来开发,然后开发成命令行版本,然后Java调用这个模块 。
架构就这样了,剩下的就是动手操作了
javaast生成代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码自动生成、javaast生成代码的信息别忘了在本站进行查找喔 。

    推荐阅读