/**
-
方法模板(内容)
-
packageName 日志所在文件的包路径
-
className 日志所在文件名
-
methodName 日志所在方法名
-
original 日志原始参数
-
classReferenceName 日志所在文件全限定名
*/
public static final List METHOD_FORMAT = Arrays.asList(“classReferenceName”,“methodName”,“original”);
public static void main(String[] args) {
String sourceUrl = SOURCE_URL;
try {
//URI uri = new URI(sourceUrl);
Path path = Paths.get(sourceUrl);
SourceRoot sourceRoot = new SourceRoot(path);
List<ParseResult> parseResults = sourceRoot.tryToParse(“src/main/java”);
for (ParseResult parseResult : parseResults) {
Optional result = parseResult.getResult();
if (!result.isPresent()) {
continue;
}
CompilationUnit cu = result.get();
LogParseV2.parse(cu);
}
//备份老文件
String srcPath = sourceUrl + FileUtil.FILE_SEPARATOR+“src”;
String destPath = sourceUrl + FileUtil.FILE_SEPARATOR+“src-bac”;
FileUtil.copy(srcPath,destPath,false);
sourceRoot.saveAll(
CodeGenerationUtils.mavenModuleRoot(LogParseV2.class)
.resolve(sourceUrl));
}catch (Exception e){
e.printStackTrace();
}
}
public static void parse(CompilationUnit cu){
if (cu == null || cu.getTypes() == null || cu.getTypes().isEmpty()) {
return;
}
boolean isLog = false;
for (ImportDeclaration anImport : cu.getImports()) {
String nameAsString = anImport.getNameAsString();
if (nameAsString.contains(“Slf4j”) || nameAsString.contains(“slf4j”)) {
isLog = true;
break;
}
}
if (!isLog){
return;
}
String packageName = cu.getPackageDeclaration().get().getNameAsString();
String className = cu.getTypes().get(0).getNameAsString();
//获取类信息
cu.accept(new ModifierVisitor() {
@Override
public Visitable visit(MethodCallExpr n, Void arg) {
String string = n.toString();
String regex = “1[O|o][G|g]\.[(info)|(debug)|(error)|(warn)].+”;
MethodCallExpr newMethodCall = new MethodCallExpr();
if (string.matches(regex)){
// 添加import
ImportDeclaration importDeclaration = new ImportDeclaration(IMPORT_NAME,false,true);
cu.addImport(importDeclaration);
NameExpr nameExpr = (NameExpr)n.getScope().get();
nameExpr.setName(LOG_UTILS_NAME);
/* if (string.contains(“info”)){
n.setName(“info”);
}else if (string.contains(“debug”)){
n.setName(“debug”);
}else if (string.contains(“error”)){
n.setName(“error”);
}else if (string.contains(“warn”)){
n.setName(“warn”);
}*/
NodeList arguments = n.getArguments();
NodeList argumentsNew = new NodeList();
StringLiteralExpr classNameExpr = new StringLiteralExpr();
classNameExpr.setValue(className);
StringLiteralExpr packageNameExpr = new StringLiteralExpr();
packageNameExpr.setValue(packageName);
StringLiteralExpr refesrenceExpr = new StringLiteralExpr();
refesrenceExpr.setValue(packageName+“.”+className);
// 获取方法名
Node node = n.getParentNode().get();
String methodName = LogParseV2.findMethod(node);
StringLiteralExpr methodNameExpr = new StringLiteralExpr();
methodNameExpr.setValue(methodName);
for (String s : METHOD_FORMAT) {
switch (s){
case “packageName” :
argumentsNew.add(packageNameExpr);
break;
case “className” :
argumentsNew.add(classNameExpr);
break;
case “methodName” :
argumentsNew.add(methodNameExpr);
break;
case “classReferenceName” :
argumentsNew.add(refesrenceExpr);
break;
case “original” :
for (Expression argument : arguments) {
argumentsNew.add(argument);
}
break;
}
}
n.setArguments(argumentsNew);
System.out.println(n.toString());
}
return super.visit(n, arg);
}
}, null);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
[外链图片转存中…(img-adGCbrYj-1713523251212)]
[外链图片转存中…(img-ZwnCxg1z-1713523251212)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
L|l ↩︎