首页 > 利用jdt快速实现pmd的功能

利用jdt快速实现pmd的功能

jdt可以做语法树分析,并且支持visitor模式对代码进行分析。跟pmd的分析方式一样,我们只要实现 visitor接口即可实现一个插件。

@Service("requestMappingInfoService")

public class RequestMappingInfoServiceImpl implements RequestMappingInfoService {





int c = 0;



private static OkHttpClient httpClient = new OkHttpClient();

private static GitlabAPI gla = GitlabAPI.connect("https://git.xxx.com", "mytoken");

private static ASTParser parser = ASTParser.newParser(AST.JLS8); //设置Java语言规范版本



static {

parser.setKind(ASTParser.K_COMPILATION_UNIT);

parser.setCompilerOptions(null);

parser.setResolveBindings(true);



Map compilerOptions = JavaCore.getOptions();

//设置Java语言版本

compilerOptions.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_8);

compilerOptions.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_8);

compilerOptions.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_8);

//设置编译选项

parser.setCompilerOptions(compilerOptions);



}



private void jdtPrase(byte[] fileContent, String giturl) {



parser.setSource(new String(fileContent).toCharArray());



//下个断点可以看看cu的types成员就是整个语法树

CompilationUnit cu = (CompilationUnit) parser.createAST(null);



//RequestMappingVisitor是个ASTVisitor的实现类 ,相当于一个插件
        RequestMappingVisitor requestMappingVisitor = new RequestMappingVisitor();

cu.accept(requestMappingVisitor); //利用这个插件visit所有的语法树节点



}

}

转载于:https://www.cnblogs.com/SEC-fsq/p/8607561.html

更多相关:

  • 1.静态方法 static:通常在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: (1)它们仅能调用其他的static方法。  (2)它们只能访问static数据。 (3)它们不能以任何方式引用this 或super。 class Simple {static v...

  • 类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:CLR会选择如下时间之一来调用静态构造函数:      1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!      2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!...

  • 2019独角兽企业重金招聘Python工程师标准>>> django的settings中包含三个static相关设置项: STATIC_ROOT STATIC_URL STATICFILES_DIRS STATIC_URL 好理解,就是映射到静态文件的url,一般为/static/ STATICFILES...

  • Socket基本编程 服务端: using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的资源。 protected overri...

  • 第一个测试的主要代码: private function closureTest():void{this.addEventListener(Event.ENTER_FRAME, onEnter);}private var num:int = 1000;private function onEnter(e:Event):void{fo...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...