├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── shell └── run.sh ├── src ├── main │ ├── java │ │ ├── copy │ │ │ └── javassist │ │ │ │ └── bytecode │ │ │ │ ├── package-info.java │ │ │ │ └── BadBytecode.java │ │ └── com │ │ │ └── adrninistrator │ │ │ └── javacg2 │ │ │ ├── dto │ │ │ ├── variabledatasource │ │ │ │ ├── AbstractVariableDataSource.java │ │ │ │ ├── VariableDataSourceField.java │ │ │ │ └── VariableDataSourceMethodArg.java │ │ │ ├── instruction │ │ │ │ ├── parseresult │ │ │ │ │ ├── BaseInstructionParseResult.java │ │ │ │ │ ├── AThrowNullParseResult.java │ │ │ │ │ ├── RetParseResult.java │ │ │ │ │ ├── ReturnParseResult.java │ │ │ │ │ ├── AThrowParseResult.java │ │ │ │ │ ├── MethodCallParseResult.java │ │ │ │ │ ├── PutFieldParseResult.java │ │ │ │ │ └── PutStaticParseResult.java │ │ │ │ └── InvokeInstructionPosAndCallee.java │ │ │ ├── accessflag │ │ │ │ └── JavaCG2AccessFlags.java │ │ │ ├── methodcode │ │ │ │ ├── MethodCodeInstructionArg.java │ │ │ │ ├── MethodCodeInstructionJump.java │ │ │ │ ├── MethodCodeInstruction.java │ │ │ │ ├── MethodCodeInstructionLookupSwitchJump.java │ │ │ │ ├── MethodCodeInstructionLookupSwitch.java │ │ │ │ └── MethodCodeInstructionTableSwitch.java │ │ │ ├── element │ │ │ │ ├── variable │ │ │ │ │ └── JSRElement.java │ │ │ │ └── constant │ │ │ │ │ ├── ConstElementNull.java │ │ │ │ │ ├── ConstElementInt.java │ │ │ │ │ ├── ConstElementByte.java │ │ │ │ │ ├── ConstElementLong.java │ │ │ │ │ ├── ConstElementFloat.java │ │ │ │ │ ├── ConstElementShort.java │ │ │ │ │ ├── ConstElementDouble.java │ │ │ │ │ ├── ConstElementString.java │ │ │ │ │ └── ConstElement.java │ │ │ ├── file │ │ │ │ └── FilePathWithName.java │ │ │ ├── type │ │ │ │ └── JavaCG2Type.java │ │ │ ├── exception │ │ │ │ ├── ThrowInfoList.java │ │ │ │ ├── CatchAndFinallyInfo.java │ │ │ │ ├── ExceptionTargetInfo.java │ │ │ │ ├── CatchInfo.java │ │ │ │ └── FinallyInfo.java │ │ │ ├── classes │ │ │ │ ├── ClassExtendsInfo.java │ │ │ │ ├── Node4ClassExtendsMethod.java │ │ │ │ └── InnerClassInfo.java │ │ │ ├── spring │ │ │ │ ├── SpringAopPointcutInfo.java │ │ │ │ ├── SpringBeanInJava.java │ │ │ │ └── SpringBeanInXml.java │ │ │ ├── jar │ │ │ │ ├── OuterInnerJarPath.java │ │ │ │ ├── ClassAndJarNum.java │ │ │ │ └── MergeJarResult.java │ │ │ ├── field │ │ │ │ ├── ClassField.java │ │ │ │ ├── ClassFieldMethodCall.java │ │ │ │ ├── FieldTypeAndName.java │ │ │ │ └── ClassFieldTypeAndName.java │ │ │ ├── counter │ │ │ │ └── JavaCG2Counter.java │ │ │ └── output │ │ │ │ └── JavaCG2OtherRunResult.java │ │ │ ├── extensions │ │ │ ├── codeparser │ │ │ │ ├── CodeParserInterface.java │ │ │ │ ├── SpringXmlBeanParserInterface.java │ │ │ │ └── JarEntryOtherFileParser.java │ │ │ ├── annotationattributes │ │ │ │ ├── AnnotationAttributesFormatterInterface.java │ │ │ │ └── DefaultAnnotationAttributesFormatter.java │ │ │ └── methodcall │ │ │ │ └── JavaCG2MethodCallExtensionInterface.java │ │ │ ├── conf │ │ │ └── enums │ │ │ │ └── interfaces │ │ │ │ ├── MainConfigInterface.java │ │ │ │ └── OtherConfigInterface.java │ │ │ ├── markdown │ │ │ ├── enums │ │ │ │ └── MDCodeBlockTypeEnum.java │ │ │ └── MarkdownConstants.java │ │ │ ├── common │ │ │ ├── enums │ │ │ │ ├── JavaCG2ArithmeticOperationTypeEnum.java │ │ │ │ ├── JavaCG2CalleeObjTypeEnum.java │ │ │ │ ├── JavaCG2FieldRelationshipTypeEnum.java │ │ │ │ └── JavaCG2DirEnum.java │ │ │ └── TypeConstants.java │ │ │ ├── el │ │ │ ├── enums │ │ │ │ ├── ElStringAnyFunctionEnum.java │ │ │ │ ├── interfaces │ │ │ │ │ ├── ElAllowedVariableInterface.java │ │ │ │ │ └── ElConfigInterface.java │ │ │ │ └── ElStringFunctionTwoArgsEnum.java │ │ │ ├── checker │ │ │ │ ├── JavaCG2ElChecker4HandleSpringBean.java │ │ │ │ ├── JavaCG2ElChecker4ParseClass.java │ │ │ │ ├── JavaCG2ElChecker4ParseMethod.java │ │ │ │ ├── JavaCG2ElChecker4MethodCall.java │ │ │ │ ├── JavaCG2ElChecker.java │ │ │ │ └── JavaCG2ElChecker4MergeFileInDir.java │ │ │ └── function │ │ │ │ ├── any │ │ │ │ ├── StringEqualsAnyFunction.java │ │ │ │ ├── StringContainsAnyFunction.java │ │ │ │ ├── StringEndsWithAnyFunction.java │ │ │ │ └── StringStartsWithAnyFunction.java │ │ │ │ ├── ignorecase │ │ │ │ ├── StringEqualsICFunction.java │ │ │ │ ├── StringContainsICFunction.java │ │ │ │ ├── StringEndsWithICFunction.java │ │ │ │ └── StringStartsWithICFunction.java │ │ │ │ └── AbstractStringFunctionTwoArgs.java │ │ │ ├── exceptions │ │ │ ├── JavaCG2Error.java │ │ │ └── JavaCG2RuntimeException.java │ │ │ ├── thread │ │ │ ├── JavaCG2UncaughtExceptionHandler.java │ │ │ └── ThreadFactory4TPE.java │ │ │ ├── comparator │ │ │ ├── Comparator4MainConfig.java │ │ │ └── Comparator4MethodArgReturnTypes.java │ │ │ └── writer │ │ │ └── WriterSupportSkip.java │ └── resources │ │ ├── _javacg2_config │ │ └── jar_dir.properties │ │ ├── _javacg2_parse_class_method_switch │ │ ├── parse_ignore_class.av │ │ └── parse_ignore_method.av │ │ ├── _javacg2_merge_file_switch │ │ ├── ignore_jar_in_dir.av │ │ ├── ignore_war_in_dir.av │ │ ├── ignore_class_in_dir.av │ │ ├── ignore_jar_in_jar_war.av │ │ ├── ignore_other_in_dir.av │ │ ├── ignore_other_in_jar_war.av │ │ ├── ignore_class_in_jar_war.av │ │ └── ignore_jar_war_by_class_dir_prefix.av │ │ ├── _javacg2_handle_xml_switch │ │ └── handle_ignore_spring_bean_in_xml.av │ │ └── _javacg2_parse_method_call_switch │ │ ├── parse_ignore_method_call_type_value_caller.av │ │ └── parse_ignore_method_call.av └── test │ ├── resources │ ├── log4j2.xml │ └── log4j2_file.xml │ └── java │ └── test │ ├── parse │ └── TestNotAllowed.java │ ├── el │ ├── fixed │ │ ├── TestElFixedTrue.java │ │ └── TestElFixedFalse.java │ ├── classmethod │ │ ├── TestElParseIgnoreMethodMethodArgNum.java │ │ ├── TestElParseIgnoreClassPackageName.java │ │ ├── TestElParseIgnoreClassSimpleClassName.java │ │ ├── TestElParseIgnoreMethodPackageName.java │ │ ├── TestElParseIgnoreMethodSimpleClassName.java │ │ ├── TestElParseIgnoreClassClassName.java │ │ ├── TestElParseIgnoreMethodClassName.java │ │ ├── TestElParseIgnoreMethodFullMethod.java │ │ └── TestElParseIgnoreMethodMethodName.java │ ├── methodcall │ │ ├── TestElParseIgnoreMethodCallEeMethodName.java │ │ ├── TestElParseIgnoreMethodCallErMethodName.java │ │ ├── TestElParseIgnoreMethodCallEeMethodArgNum.java │ │ ├── TestElParseIgnoreMethodCallErMethodArgNum.java │ │ ├── TestElParseIgnoreMethodCallErPackageName.java │ │ ├── TestElParseIgnoreMethodCallEePackageName.java │ │ ├── TestElParseIgnoreMethodCallErSimpleClassName.java │ │ ├── TestElParseIgnoreMethodCallEeClassName.java │ │ ├── TestElParseIgnoreMethodCallErClassName.java │ │ ├── TestElParseIgnoreMethodCallEeSimpleClassName.java │ │ ├── TestElParseIgnoreMethodCallEeFullMethod.java │ │ ├── TestElParseIgnoreMethodCallErFullMethod.java │ │ └── TestElParseIgnoreMethodCallMethodCallType.java │ ├── mergefile │ │ ├── TestElMergeFileIgnoreOtherInDirOFE.java │ │ ├── TestElMergeFileIgnoreWarInDirFN.java │ │ ├── TestElMergeFileIgnoreJarInDirFN.java │ │ ├── TestElMergeFileIgnoreOtherInDirFN.java │ │ ├── TestElMergeFileIgnoreOtherInJarOFE.java │ │ ├── TestElMergeFileIgnoreOtherInWarOFE.java │ │ ├── TestElMergeFileIgnoreClassInDirFN.java │ │ ├── TestElMergeFileIgnoreJarInJarFN.java │ │ ├── TestElMergeFileIgnoreJarInWarFN.java │ │ ├── TestElMergeFileIgnoreOtherInJarFN.java │ │ ├── TestElMergeFileIgnoreOtherInWarFN.java │ │ ├── TestElMergeFileIgnoreClassInJarFN.java │ │ ├── TestElMergeFileIgnoreClassInWarFN.java │ │ ├── TestElMergeFileIgnoreWarInDirAFPID.java │ │ ├── TestElMergeFileIgnoreJarInDirAFPID.java │ │ ├── TestElMergeFileIgnoreJarInJarFDPIJW.java │ │ ├── TestElMergeFileIgnoreJarInJarFPIJW.java │ │ ├── TestElMergeFileIgnoreJarInWarFPIJW.java │ │ ├── TestElMergeFileIgnoreJarInWarFDPIJW.java │ │ ├── TestElMergeFileIgnoreJarInDirAFDPID.java │ │ ├── TestElMergeFileIgnoreOtherInDirAFPID.java │ │ ├── TestElMergeFileIgnoreOtherInJarFDPIJW.java │ │ ├── TestElMergeFileIgnoreOtherInWarFDPIJW.java │ │ ├── TestElMergeFileIgnoreWarInDirAFDPID.java │ │ ├── TestElMergeFileIgnoreClassInJarFPIJW.java │ │ ├── TestElMergeFileIgnoreOtherInJarFPIJW.java │ │ ├── TestElMergeFileIgnoreOtherInWarFPIJW.java │ │ ├── TestElMergeFileIgnoreClassInDirAFPID.java │ │ ├── TestElMergeFileIgnoreOtherInDirAFDPID.java │ │ ├── TestElMergeFileIgnoreClassInWarFPIJW.java │ │ ├── TestElMergeFileIgnoreClassInJarFDPIJW.java │ │ ├── TestElMergeFileIgnoreClassInDirAFDPID.java │ │ ├── TestElMergeFileIgnoreClassInWarFDPIJW.java │ │ ├── TestElMergeFileIgnoreClassInJarCFPIJW.java │ │ ├── TestElMergeFileIgnoreClassInWarCFPIJW.java │ │ └── TestElMergeFileIgnoreJarByClassDirPrefix.java │ ├── handlespbinxml │ │ ├── TestElHandleIgnoreSPBInXmlClassName.java │ │ ├── TestElHandleIgnoreSPBInXmlProfile.java │ │ └── TestElHandleIgnoreSPBInXmlBeanName.java │ ├── methodcalltypevalue │ │ ├── TestElParseIgnoreMethodCallTypeValueErMethodName.java │ │ ├── TestElParseIgnoreMethodCallTypeValueErMethodArgNum.java │ │ ├── TestElParseIgnoreMethodCallTypeValueErPackageName.java │ │ ├── TestElParseIgnoreMethodCallTypeValueErSimpleClassName.java │ │ ├── TestElParseIgnoreMethodCallTypeValueErClassName.java │ │ └── TestElParseIgnoreMethodCallTypeValueErFullMethod.java │ └── stringcompare │ │ ├── TestElParseIgnoreClassClassNameEquals.java │ │ ├── TestElParseIgnoreClassClassNameContains.java │ │ ├── TestElParseIgnoreClassClassNameEndsWith.java │ │ ├── TestElParseIgnoreClassClassNameStartsWith.java │ │ ├── TestElParseIgnoreClassClassNameEqualsIC.java │ │ ├── TestElParseIgnoreClassClassNameContainsIC.java │ │ ├── TestElParseIgnoreClassClassNameEndsWithIC.java │ │ ├── TestElParseIgnoreClassClassNameStartsWithIC.java │ │ ├── TestElParseIgnoreClassClassNameEqualsAny.java │ │ ├── TestElParseIgnoreClassClassNameContainsAny.java │ │ ├── TestElParseIgnoreClassClassNameEndsWithAny.java │ │ ├── TestElParseIgnoreClassClassNameStartsWithAny.java │ │ ├── TestElParseIgnoreClassClassNameAnd.java │ │ └── TestElParseIgnoreClassClassNameOr.java │ └── config │ └── TestConfigUsage.java ├── .gitignore ├── bat └── run.bat └── docs ├── call_type.md └── file_desc.md /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Adrninistrator/java-callgraph2/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /shell/run.sh: -------------------------------------------------------------------------------- 1 | java -Dfile.encoding=UTF-8 -cp .:./jar/run_javacg2.jar:./lib/*:./config com.adrninistrator.javacg2.entry.JavaCG2Entry -------------------------------------------------------------------------------- /src/main/java/copy/javassist/bytecode/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author adrninistrator 3 | * @date 2022/12/6 4 | * @description: javassist-3.28.0-GA 5 | */ 6 | package copy.javassist.bytecode; 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | bin/ 3 | out/ 4 | .project 5 | .settings/ 6 | .idea/ 7 | .gradle/ 8 | *.iml 9 | .classpath 10 | jar_output_dir/ 11 | log_javacg2/ 12 | runlocal/ 13 | config_local/ -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://mirrors.aliyun.com/gradle/distributions/v7.6.6/gradle-7.6.6-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /bat/run.bat: -------------------------------------------------------------------------------- 1 | SETLOCAL ENABLEDELAYEDEXPANSION 2 | set CLASSPATH= 3 | FOR %%C IN (lib\*.jar) DO set CLASSPATH=!CLASSPATH!;%%C 4 | echo %CLASSPATH% 5 | java -Dfile.encoding=UTF-8 -cp .;./jar/run_javacg2.jar;%CLASSPATH%;./config com.adrninistrator.javacg2.entry.JavaCG2Entry 6 | 7 | pause... -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/variabledatasource/AbstractVariableDataSource.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.variabledatasource; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/6/12 6 | * @description: 变量的数据来源,基类 7 | */ 8 | public abstract class AbstractVariableDataSource { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/BaseInstructionParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2022/10/5 6 | * @description: 指令解析结果基类 7 | */ 8 | public abstract class BaseInstructionParseResult { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_config/jar_dir.properties: -------------------------------------------------------------------------------- 1 | # 对应的枚举类名: JavaCG2OtherConfigFileUseListEnum.OCFULE_JAR_DIR 2 | # (作用) 指定需要解析的jar、war、jmod文件路径,或保存class、jar、war、jmod文件的目录路径(每行代表一条记录,支持多行) 3 | # (格式) 路径中的分隔符支持使用/或\,目录最后指定或不指定分隔符均可 4 | # (示例) build/ 5 | # (示例) build/test.jar 6 | # (示例) D:/test/build/test.jar 7 | # (示例) jdk-21.0.4+7/jmods/java.base.jmod 8 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/codeparser/CodeParserInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.codeparser; 2 | 3 | /** 4 | * @author Adrninistrator 5 | * @date 2021/8/10 6 | * @description: 对jar文件中的文件或字节码解析类的基础接口 7 | */ 8 | public interface CodeParserInterface { 9 | 10 | /** 11 | * 初始化,整个执行过程中只执行一次 12 | */ 13 | default void initCodeParser() { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/accessflag/JavaCG2AccessFlags.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.accessflag; 2 | 3 | import org.apache.bcel.classfile.AccessFlags; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/12/7 8 | * @description: 9 | */ 10 | public class JavaCG2AccessFlags extends AccessFlags { 11 | public JavaCG2AccessFlags(int accessFlags) { 12 | super(accessFlags); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/AThrowNullParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2024/1/15 6 | * @description: ATHROW指令解析结果,抛出异常为null(throw null是合法的写法) 7 | */ 8 | public class AThrowNullParseResult extends AThrowParseResult { 9 | 10 | public AThrowNullParseResult() { 11 | super(null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/annotationattributes/AnnotationAttributesFormatterInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.annotationattributes; 2 | 3 | import org.apache.bcel.classfile.ElementValuePair; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/8/28 8 | * @description: 对注解属性的元素值进行格式化的接口 9 | */ 10 | public interface AnnotationAttributesFormatterInterface { 11 | 12 | String format(ElementValuePair elementValuePair); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/conf/enums/interfaces/MainConfigInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.conf.enums.interfaces; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/3/27 6 | * @description: 主要配置文件继承的接口 7 | */ 8 | public interface MainConfigInterface extends ConfigInterface { 9 | // 字段名称 10 | String getFileName(); 11 | 12 | // 字段类型 13 | Class getType(); 14 | 15 | // 是否不允许为空 16 | boolean isNotBlank(); 17 | 18 | // 默认值 19 | String getDefaultValue(); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstructionArg.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/3/21 6 | * @description: 方法代码指令,包含一个参数 7 | */ 8 | public class MethodCodeInstructionArg extends MethodCodeInstruction { 9 | 10 | // 参数 11 | private String arg; 12 | 13 | public String getArg() { 14 | return arg; 15 | } 16 | 17 | public void setArg(String arg) { 18 | this.arg = arg; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/conf/enums/interfaces/OtherConfigInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.conf.enums.interfaces; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/1/30 6 | * @description: List与Set格式的其他枚举配置实现的接口 7 | */ 8 | public interface OtherConfigInterface extends ConfigInterface { 9 | 10 | // 配置参数属于Set类型还是List类型 11 | boolean isSetOrList(); 12 | 13 | // 通过key获取对应的配置枚举 14 | OtherConfigInterface getFromKey(String key); 15 | 16 | // 默认值 17 | String[] getDefaultValues(); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/markdown/enums/MDCodeBlockTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.markdown.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2022/11/27 6 | * @description: markdown代码块类型枚举 7 | */ 8 | public enum MDCodeBlockTypeEnum { 9 | MDCBTE_SQL("sql"), 10 | MDCBTE_JAVA("java"), 11 | MDCBTE_JS("js"), 12 | ; 13 | 14 | private final String type; 15 | 16 | MDCodeBlockTypeEnum(String type) { 17 | this.type = type; 18 | } 19 | 20 | public String getType() { 21 | return type; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstructionJump.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/3/21 6 | * @description: 方法代码指令,跳转 7 | */ 8 | public class MethodCodeInstructionJump extends MethodCodeInstruction { 9 | 10 | // 跳转目标指令偏移量 11 | private int targetOffset; 12 | 13 | public int getTargetOffset() { 14 | return targetOffset; 15 | } 16 | 17 | public void setTargetOffset(int targetOffset) { 18 | this.targetOffset = targetOffset; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/common/enums/JavaCG2ArithmeticOperationTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.common.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/8/5 6 | * @description: 算术运算类型枚举 7 | */ 8 | public enum JavaCG2ArithmeticOperationTypeEnum { 9 | AOTE_ADD("+"), 10 | AOTE_SUB("-"), 11 | AOTE_MUL("*"), 12 | AOTE_DIV("/"), 13 | ; 14 | 15 | private final String type; 16 | 17 | JavaCG2ArithmeticOperationTypeEnum(String type) { 18 | this.type = type; 19 | } 20 | 21 | public String getType() { 22 | return type; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/variable/JSRElement.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.variable; 2 | 3 | import com.adrninistrator.javacg2.common.JavaCG2Constants; 4 | import org.apache.bcel.generic.InstructionHandle; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/9/20 9 | * @description: JSR指令向操作数栈添加的元素 10 | */ 11 | public class JSRElement extends LocalVariableElement { 12 | 13 | // 使用value保存JSR下一条指令 14 | public JSRElement(InstructionHandle nextIh) { 15 | super(JavaCG2Constants.JSR_TYPE, 0, nextIh, JavaCG2Constants.LOCAL_VARIABLE_INDEX_NOT_USED, null); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/enums/ElStringAnyFunctionEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/2/10 6 | * @description: 7 | */ 8 | public enum ElStringAnyFunctionEnum { 9 | CONTAINS_ANY("string.containsAny"), 10 | ENDS_WITH_ANY("string.endsWithAny"), 11 | EQUALS_ANY("string.equalsAny"), 12 | STARTS_WITH_ANY("string.startsWithAny"), 13 | ; 14 | 15 | private final String name; 16 | 17 | ElStringAnyFunctionEnum(String name) { 18 | this.name = name; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_parse_class_method_switch/parse_ignore_class.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS 2 | ## (作用)在 解析类或方法时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过解析对应的类或方法 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的类或方法 5 | ## (范围)指定是否跳过解析类 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_parse_class_method_switch/parse_ignore_class.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {class_name} {String} {完整类名} {a.b.Class1} 11 | ## {package_name} {String} {完整包名, 不会以.结束} {a.b} 12 | ## {simple_class_name} {String} {简单类名} {Class1} 13 | -------------------------------------------------------------------------------- /src/test/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/enums/interfaces/ElAllowedVariableInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.enums.interfaces; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/2/2 6 | * @description: 表达式允许使用的变量接口 7 | */ 8 | public interface ElAllowedVariableInterface { 9 | 10 | // 获取变量名称 11 | String getVariableName(); 12 | 13 | // 获取变量类型 14 | String getType(); 15 | 16 | // 是否为 {名称前缀}{数字} 的形式 17 | boolean isPrefixWithNum(); 18 | 19 | // 获取变量描述 20 | String[] getDescriptions(); 21 | 22 | // 获取变量示例 23 | String[] getValueExamples(); 24 | 25 | // 获取枚举常量名称 26 | String getEnumConstantName(); 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/test/parse/TestNotAllowed.java: -------------------------------------------------------------------------------- 1 | package test.parse; 2 | 3 | import org.junit.Test; 4 | import test.base.TestBase; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/3 9 | * @description: 10 | */ 11 | public class TestNotAllowed extends TestBase { 12 | 13 | @Test 14 | public void testSingleClass() { 15 | run(false, false, "out/test/classes/test/base/TestBase.class"); 16 | } 17 | 18 | @Test 19 | public void testMultiClass() { 20 | run(false, false, 21 | "out/test/classes/test/base/TestBase.class", 22 | "out/test/classes/test/simple/TestSimple.class" 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/RetParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import org.apache.bcel.generic.InstructionHandle; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/10/29 8 | * @description: RET指令的解析结果 9 | */ 10 | public class RetParseResult extends BaseInstructionParseResult { 11 | 12 | // 对应的jsr指令的下一条指令 13 | private final InstructionHandle jsrNextIh; 14 | 15 | public RetParseResult(InstructionHandle jsrNextIh) { 16 | this.jsrNextIh = jsrNextIh; 17 | } 18 | 19 | public InstructionHandle getJsrNextIh() { 20 | return jsrNextIh; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker4HandleSpringBean.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/10/18 9 | * @description: 10 | */ 11 | public class JavaCG2ElChecker4HandleSpringBean extends JavaCG2ElChecker { 12 | 13 | @Override 14 | protected void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig) { 15 | elManager.checkIgnoreSpringBeanInXml("bean1", JavaCG2ElChecker4ParseClass.CLASS_NAME_EXAMPLE, "dev"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/ReturnParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import com.adrninistrator.javacg2.dto.element.BaseElement; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/11/4 8 | * @description: RETURN类指令的解析结果 9 | */ 10 | public class ReturnParseResult extends BaseInstructionParseResult { 11 | 12 | // 返回元素 13 | private final BaseElement returnElement; 14 | 15 | public ReturnParseResult(BaseElement returnElement) { 16 | this.returnElement = returnElement; 17 | } 18 | 19 | public BaseElement getReturnElement() { 20 | return returnElement; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/enums/ElStringFunctionTwoArgsEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/2/22 6 | * @description: 7 | */ 8 | public enum ElStringFunctionTwoArgsEnum { 9 | CONTAINS_IGNORE_CASE("string.containsIC"), 10 | ENDS_WITH_IGNORE_CASE("string.endsWithIC"), 11 | EQUALS_IGNORE_CASE("string.equalsIC"), 12 | STARTS_WITH_IGNORE_CASE("string.startsWithIC"), 13 | ; 14 | 15 | private final String name; 16 | 17 | ElStringFunctionTwoArgsEnum(String name) { 18 | this.name = name; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker4ParseClass.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/13 9 | * @description: 10 | */ 11 | public class JavaCG2ElChecker4ParseClass extends JavaCG2ElChecker { 12 | 13 | public static final String CLASS_NAME_EXAMPLE = "a.b.C"; 14 | 15 | @Override 16 | protected void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig) { 17 | elManager.checkIgnoreParseClass(CLASS_NAME_EXAMPLE); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/file/FilePathWithName.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.file; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/7/27 6 | * @description: 文件路径及文件名称 7 | */ 8 | public class FilePathWithName { 9 | 10 | private String filePath; 11 | 12 | private String fileName; 13 | 14 | public String getFilePath() { 15 | return filePath; 16 | } 17 | 18 | public void setFilePath(String filePath) { 19 | this.filePath = filePath; 20 | } 21 | 22 | public String getFileName() { 23 | return fileName; 24 | } 25 | 26 | public void setFileName(String fileName) { 27 | this.fileName = fileName; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/AThrowParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import com.adrninistrator.javacg2.dto.element.variable.VariableElement; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2024/1/2 8 | * @description: ATHROW指令解析结果 9 | */ 10 | public class AThrowParseResult extends BaseInstructionParseResult { 11 | 12 | // 抛出的异常 13 | private final VariableElement throwElement; 14 | 15 | public AThrowParseResult(VariableElement throwElement) { 16 | this.throwElement = throwElement; 17 | } 18 | 19 | public VariableElement getThrowElement() { 20 | return throwElement; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/enums/interfaces/ElConfigInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.enums.interfaces; 2 | 3 | import com.adrninistrator.javacg2.conf.enums.interfaces.ConfigInterface; 4 | import com.adrninistrator.javacg2.el.checker.AbstractElChecker; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/1 9 | * @description: 表达式配置接口 10 | */ 11 | public interface ElConfigInterface extends ConfigInterface { 12 | 13 | // 获取配置文件允许使用的表达式变量枚举 14 | ElAllowedVariableInterface[] getElAllowedVariableEnums(); 15 | 16 | // 用于提前执行表达式进行检查的类 17 | Class getElCheckClass(); 18 | 19 | // 当前参数是否用于忽略数据 20 | boolean isIgnoreData(); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/any/StringEqualsAnyFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.any; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringAnyFunctionEnum; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/8 9 | * @description: 10 | */ 11 | public class StringEqualsAnyFunction extends AbstractStringAnyFunction { 12 | 13 | @Override 14 | public String getName() { 15 | return ElStringAnyFunctionEnum.EQUALS_ANY.getName(); 16 | } 17 | 18 | @Override 19 | protected boolean checkString(String arg0, String argN) { 20 | return StringUtils.equals(arg0, argN); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/any/StringContainsAnyFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.any; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringAnyFunctionEnum; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/8 9 | * @description: 10 | */ 11 | public class StringContainsAnyFunction extends AbstractStringAnyFunction { 12 | 13 | @Override 14 | public String getName() { 15 | return ElStringAnyFunctionEnum.CONTAINS_ANY.getName(); 16 | } 17 | 18 | @Override 19 | protected boolean checkString(String arg0, String argN) { 20 | return StringUtils.contains(arg0, argN); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/any/StringEndsWithAnyFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.any; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringAnyFunctionEnum; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/8 9 | * @description: 10 | */ 11 | public class StringEndsWithAnyFunction extends AbstractStringAnyFunction { 12 | 13 | @Override 14 | public String getName() { 15 | return ElStringAnyFunctionEnum.ENDS_WITH_ANY.getName(); 16 | } 17 | 18 | @Override 19 | protected boolean checkString(String arg0, String argN) { 20 | return StringUtils.endsWith(arg0, argN); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/any/StringStartsWithAnyFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.any; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringAnyFunctionEnum; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/8 9 | * @description: 10 | */ 11 | public class StringStartsWithAnyFunction extends AbstractStringAnyFunction { 12 | 13 | @Override 14 | public String getName() { 15 | return ElStringAnyFunctionEnum.STARTS_WITH_ANY.getName(); 16 | } 17 | 18 | @Override 19 | protected boolean checkString(String arg0, String argN) { 20 | return StringUtils.startsWith(arg0, argN); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_jar_in_dir.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并目录中的jar文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_jar_in_dir.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {目录中的文件绝对路径, 以斜杠/为分隔符} {D:/a/b.jar, /tmp/a/b.jar} 11 | ## {file_dir_path} {String} {目录中的文件所在目录绝对路径, 以斜杠/为分隔符,不以分隔符结尾} {D:/a, /tmp/a} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_war_in_dir.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_WAR_IN_DIR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并目录中的war文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_war_in_dir.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {目录中的文件绝对路径, 以斜杠/为分隔符} {D:/a/b.jar, /tmp/a/b.jar} 11 | ## {file_dir_path} {String} {目录中的文件所在目录绝对路径, 以斜杠/为分隔符,不以分隔符结尾} {D:/a, /tmp/a} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_class_in_dir.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_DIR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并目录中的class文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_class_in_dir.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {目录中的文件绝对路径, 以斜杠/为分隔符} {D:/a/b.jar, /tmp/a/b.jar} 11 | ## {file_dir_path} {String} {目录中的文件所在目录绝对路径, 以斜杠/为分隔符,不以分隔符结尾} {D:/a, /tmp/a} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker4ParseMethod.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/13 9 | * @description: 10 | */ 11 | public class JavaCG2ElChecker4ParseMethod extends JavaCG2ElChecker { 12 | 13 | public static final String FULL_METHOD_EXAMPLE = JavaCG2ElChecker4ParseClass.CLASS_NAME_EXAMPLE + ":fun(int)"; 14 | 15 | @Override 16 | protected void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig) { 17 | elManager.checkIgnoreParseMethod(FULL_METHOD_EXAMPLE); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/type/JavaCG2Type.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.type; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2024/11/14 6 | * @description: 包含数组维度的类型 7 | */ 8 | public class JavaCG2Type { 9 | 10 | // 类型 11 | protected String type; 12 | 13 | // 属于数组类型时的数组维度,0代表不是数组 14 | protected int arrayDimensions; 15 | 16 | public String getType() { 17 | return type; 18 | } 19 | 20 | public void setType(String type) { 21 | this.type = type; 22 | } 23 | 24 | public int getArrayDimensions() { 25 | return arrayDimensions; 26 | } 27 | 28 | public void setArrayDimensions(int arrayDimensions) { 29 | this.arrayDimensions = arrayDimensions; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/codeparser/SpringXmlBeanParserInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.codeparser; 2 | 3 | import com.adrninistrator.javacg2.dto.spring.SpringBeanInXml; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2023/3/13 10 | * @description: 对Spring XML文件中的bean解析的接口 11 | */ 12 | public interface SpringXmlBeanParserInterface extends JarEntryOtherFileParser { 13 | 14 | /** 15 | * 根据Spring Bean的id获取对应的类名 16 | * 17 | * @param beanId 18 | * @return 19 | */ 20 | String getBeanClass(String beanId); 21 | 22 | /** 23 | * 获取XML中定义的Spring Bean信息 24 | * 25 | * @return 26 | */ 27 | List getBeanInXml(); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/exception/ThrowInfoList.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.exception; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2024/1/2 9 | * @description: 代码中抛出的可能的异常信息列表 10 | */ 11 | public class ThrowInfoList { 12 | 13 | private final List throwInfoList = new ArrayList<>(1); 14 | 15 | public void addThrowInfo(ThrowInfo throwInfo) { 16 | if (!throwInfoList.contains(throwInfo)) { 17 | throwInfoList.add(throwInfo); 18 | } 19 | } 20 | 21 | public int size() { 22 | return throwInfoList.size(); 23 | } 24 | 25 | public ThrowInfo get(int i) { 26 | return throwInfoList.get(i); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/classes/ClassExtendsInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.classes; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2024/7/10 6 | * @description: 类涉及继承的信息,包含类的accessFlags,父类 7 | */ 8 | public class ClassExtendsInfo { 9 | 10 | // 类的accessFlags 11 | private final int accessFlags; 12 | 13 | // 父类名称 14 | private final String superClassName; 15 | 16 | public ClassExtendsInfo(int accessFlags, String superClassName) { 17 | this.accessFlags = accessFlags; 18 | this.superClassName = superClassName; 19 | } 20 | 21 | public int getAccessFlags() { 22 | return accessFlags; 23 | } 24 | 25 | public String getSuperClassName() { 26 | return superClassName; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementNull.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 10 | */ 11 | public class ConstElementNull extends ConstElement { 12 | public ConstElementNull() { 13 | super(null); 14 | } 15 | 16 | @Override 17 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 18 | return JavaCG2ConstantTypeEnum.CONSTTE_NULL; 19 | } 20 | 21 | @Override 22 | public BaseElement copyElement() { 23 | return new ConstElementNull(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_jar_in_jar_war.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并jar、war中的jar文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_jar_in_jar_war.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {jar/war文件中的文件相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头} {a/b/c.jar, a/b/c.xml} 11 | ## {file_dir_path} {String} {jar/war文件中的文件所在目录相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头或结尾} {a, a/b} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/spring/SpringAopPointcutInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.spring; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/6/27 6 | * @description: 7 | */ 8 | public class SpringAopPointcutInfo { 9 | 10 | // 完整方法 11 | private String fullMethod; 12 | 13 | // pointcut的表达式 14 | private String expression; 15 | 16 | public String getFullMethod() { 17 | return fullMethod; 18 | } 19 | 20 | public void setFullMethod(String fullMethod) { 21 | this.fullMethod = fullMethod; 22 | } 23 | 24 | public String getExpression() { 25 | return expression; 26 | } 27 | 28 | public void setExpression(String expression) { 29 | this.expression = expression; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstruction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/3/18 6 | * @description: 方法代码指令 7 | */ 8 | public class MethodCodeInstruction { 9 | 10 | // 指令偏移量 11 | private int offset; 12 | 13 | // 指令名称 14 | private String instructionName; 15 | 16 | public int getOffset() { 17 | return offset; 18 | } 19 | 20 | public void setOffset(int offset) { 21 | this.offset = offset; 22 | } 23 | 24 | public String getInstructionName() { 25 | return instructionName; 26 | } 27 | 28 | public void setInstructionName(String instructionName) { 29 | this.instructionName = instructionName; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/exceptions/JavaCG2Error.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.exceptions; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/4/2 6 | * @description: 7 | */ 8 | public class JavaCG2Error extends Error { 9 | public JavaCG2Error() { 10 | } 11 | 12 | public JavaCG2Error(String message) { 13 | super(message); 14 | } 15 | 16 | public JavaCG2Error(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public JavaCG2Error(Throwable cause) { 21 | super(cause); 22 | } 23 | 24 | public JavaCG2Error(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 25 | super(message, cause, enableSuppression, writableStackTrace); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementInt.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 10 | */ 11 | public class ConstElementInt extends ConstElement { 12 | 13 | public ConstElementInt(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_INT; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementInt(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstructionLookupSwitchJump.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/3/21 6 | * @description: lookupswitch指令中的数据 7 | */ 8 | public class MethodCodeInstructionLookupSwitchJump { 9 | 10 | // 索引 11 | private int index; 12 | 13 | // 跳转目标指令偏移量 14 | private int targetOffset; 15 | 16 | public int getIndex() { 17 | return index; 18 | } 19 | 20 | public void setIndex(int index) { 21 | this.index = index; 22 | } 23 | 24 | public int getTargetOffset() { 25 | return targetOffset; 26 | } 27 | 28 | public void setTargetOffset(int targetOffset) { 29 | this.targetOffset = targetOffset; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/methodcall/JavaCG2MethodCallExtensionInterface.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.methodcall; 2 | 3 | import com.adrninistrator.javacg2.dto.call.MethodCall; 4 | import com.adrninistrator.javacg2.dto.call.MethodCallList; 5 | import com.adrninistrator.javacg2.dto.counter.JavaCG2Counter; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/15 10 | * @description: 方法调用处理扩展类接口 11 | */ 12 | public interface JavaCG2MethodCallExtensionInterface { 13 | 14 | /** 15 | * 处理方法调用 16 | * 17 | * @param methodCall 当前的方法调用 18 | * @param callIdCounter 方法调用计数器 19 | * @param methodCallList 方法调用列表 20 | */ 21 | void handle(MethodCall methodCall, JavaCG2Counter callIdCounter, MethodCallList methodCallList); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementByte.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/14 9 | * @description: 10 | */ 11 | public class ConstElementByte extends ConstElement { 12 | 13 | public ConstElementByte(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_BYTE; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementByte(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementLong.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 10 | */ 11 | public class ConstElementLong extends ConstElement { 12 | 13 | public ConstElementLong(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_LONG; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementLong(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/common/enums/JavaCG2CalleeObjTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.common.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/3/6 6 | * @description: 被调用类型枚举 7 | */ 8 | public enum JavaCG2CalleeObjTypeEnum { 9 | COTE_THIS("t", "调用当前实例的方法"), 10 | COTE_STATIC_FIELD("sf", "调用静态字段的方法"), 11 | COTE_FIELD("f", "调用字段的方法"), 12 | COTE_VARIABLE("v", "调用其他变量的方法"), 13 | ; 14 | 15 | private final String type; 16 | private final String desc; 17 | 18 | JavaCG2CalleeObjTypeEnum(String type, String desc) { 19 | this.type = type; 20 | this.desc = desc; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public String getDesc() { 28 | return desc; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementFloat.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 10 | */ 11 | public class ConstElementFloat extends ConstElement { 12 | 13 | public ConstElementFloat(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_FLOAT; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementFloat(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementShort.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/14 9 | * @description: 10 | */ 11 | public class ConstElementShort extends ConstElement { 12 | 13 | public ConstElementShort(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_SHORT; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementShort(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/exception/CatchAndFinallyInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.exception; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2023/12/28 9 | * @description: Exception table中某个try对应的catch、finally信息 10 | */ 11 | public class CatchAndFinallyInfo { 12 | 13 | private final List catchInfoList = new ArrayList<>(); 14 | 15 | private FinallyInfo finallyInfo; 16 | 17 | public List getCatchInfoList() { 18 | return catchInfoList; 19 | } 20 | 21 | public FinallyInfo getFinallyInfo() { 22 | return finallyInfo; 23 | } 24 | 25 | public void setFinallyInfo(FinallyInfo finallyInfo) { 26 | this.finallyInfo = finallyInfo; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementDouble.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 10 | */ 11 | public class ConstElementDouble extends ConstElement { 12 | 13 | public ConstElementDouble(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_DOUBLE; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementDouble(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElementString.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/14 9 | * @description: 10 | */ 11 | public class ConstElementString extends ConstElement { 12 | 13 | public ConstElementString(Object value) { 14 | super(value); 15 | } 16 | 17 | @Override 18 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 19 | return JavaCG2ConstantTypeEnum.CONSTTE_STRING; 20 | } 21 | 22 | @Override 23 | public BaseElement copyElement() { 24 | return new ConstElementString(value); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_handle_xml_switch/handle_ignore_spring_bean_in_xml.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_HANDLE_IGNORE_SPRING_BEAN_IN_XML 2 | ## (作用)在 处理XML文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过对应的XML文件中的元素 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的XML文件中的元素 5 | ## (范围)指定处理XML文件中定义的Spring Bean需要跳过哪些Bean 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_handle_xml_switch/handle_ignore_spring_bean_in_xml.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {bean_name} {String} {Spring Bean名称} {selectService1} 11 | ## {class_name} {String} {Spring Bean类名} {test.callgraph.mybatis.service.select.SelectService1} 12 | ## {profile} {String} {Spring Bean profile, 可能为空字符串,可能包含一级或多级,使用半角逗号拼接} {dev, dev,dev1} 13 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/jar/OuterInnerJarPath.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.jar; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/1/27 6 | * @description: jar/war文件及其中的jar文件 7 | */ 8 | public class OuterInnerJarPath { 9 | 10 | // 外层jar/war文件路径 11 | private String outerJarPath; 12 | 13 | // 内层jar文件路径 14 | private String innerJarPath; 15 | 16 | public String getOuterJarPath() { 17 | return outerJarPath; 18 | } 19 | 20 | public void setOuterJarPath(String outerJarPath) { 21 | this.outerJarPath = outerJarPath; 22 | } 23 | 24 | public String getInnerJarPath() { 25 | return innerJarPath; 26 | } 27 | 28 | public void setInnerJarPath(String innerJarPath) { 29 | this.innerJarPath = innerJarPath; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/markdown/MarkdownConstants.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.markdown; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/2/17 6 | * @description: markdown相关常量 7 | */ 8 | public class MarkdownConstants { 9 | 10 | public static final String FLAG_TITLE = "#"; 11 | public static final String FLAG_SPACE = " "; 12 | public static final String FLAG_CODE = "```"; 13 | public static final String FLAG_LIST = "- "; 14 | public static final String FLAG_DOT = "."; 15 | public static final String FLAG_VERTICAL_BAR = "|"; 16 | public static final String FLAG_TABLE_LINE = "---"; 17 | public static final String FLAG_HTML_NEW_LINE = "
"; 18 | 19 | private MarkdownConstants() { 20 | throw new IllegalStateException("illegal"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_other_in_dir.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并目录中的非jar、war、class文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_other_in_dir.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {目录中的文件绝对路径, 以斜杠/为分隔符} {D:/a/b.jar, /tmp/a/b.jar} 11 | ## {file_dir_path} {String} {目录中的文件所在目录绝对路径, 以斜杠/为分隔符,不以分隔符结尾} {D:/a, /tmp/a} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | ## {file_ext} {String} {非jar、war、class文件后缀, 以.开头} {.xml, .properties} 14 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/ignorecase/StringEqualsICFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.ignorecase; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringFunctionTwoArgsEnum; 4 | import com.adrninistrator.javacg2.el.function.AbstractStringFunctionTwoArgs; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/22 10 | * @description: 11 | */ 12 | public class StringEqualsICFunction extends AbstractStringFunctionTwoArgs { 13 | @Override 14 | protected boolean checkString(String argSrc, String argDst) { 15 | return StringUtils.equalsIgnoreCase(argSrc, argDst); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return ElStringFunctionTwoArgsEnum.EQUALS_IGNORE_CASE.getName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker4MethodCall.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2CallTypeEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/13 10 | * @description: 11 | */ 12 | public class JavaCG2ElChecker4MethodCall extends JavaCG2ElChecker { 13 | 14 | @Override 15 | protected void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig) { 16 | elManager.checkIgnoreMethodCall(JavaCG2CallTypeEnum.values()[0].getType(), JavaCG2ElChecker4ParseMethod.FULL_METHOD_EXAMPLE, 17 | JavaCG2ElChecker4ParseMethod.FULL_METHOD_EXAMPLE); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/ignorecase/StringContainsICFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.ignorecase; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringFunctionTwoArgsEnum; 4 | import com.adrninistrator.javacg2.el.function.AbstractStringFunctionTwoArgs; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/22 10 | * @description: 11 | */ 12 | public class StringContainsICFunction extends AbstractStringFunctionTwoArgs { 13 | @Override 14 | protected boolean checkString(String argSrc, String argDst) { 15 | return StringUtils.containsIgnoreCase(argSrc, argDst); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return ElStringFunctionTwoArgsEnum.CONTAINS_IGNORE_CASE.getName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/ignorecase/StringEndsWithICFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.ignorecase; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringFunctionTwoArgsEnum; 4 | import com.adrninistrator.javacg2.el.function.AbstractStringFunctionTwoArgs; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/22 10 | * @description: 11 | */ 12 | public class StringEndsWithICFunction extends AbstractStringFunctionTwoArgs { 13 | @Override 14 | protected boolean checkString(String argSrc, String argDst) { 15 | return StringUtils.endsWithIgnoreCase(argSrc, argDst); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return ElStringFunctionTwoArgsEnum.ENDS_WITH_IGNORE_CASE.getName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/ignorecase/StringStartsWithICFunction.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function.ignorecase; 2 | 3 | import com.adrninistrator.javacg2.el.enums.ElStringFunctionTwoArgsEnum; 4 | import com.adrninistrator.javacg2.el.function.AbstractStringFunctionTwoArgs; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/2/22 10 | * @description: 11 | */ 12 | public class StringStartsWithICFunction extends AbstractStringFunctionTwoArgs { 13 | @Override 14 | protected boolean checkString(String argSrc, String argDst) { 15 | return StringUtils.startsWithIgnoreCase(argSrc, argDst); 16 | } 17 | 18 | @Override 19 | public String getName() { 20 | return ElStringFunctionTwoArgsEnum.STARTS_WITH_IGNORE_CASE.getName(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_parse_class_method_switch/parse_ignore_method.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD 2 | ## (作用)在 解析类或方法时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过解析对应的类或方法 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的类或方法 5 | ## (范围)指定是否跳过解析方法 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_parse_class_method_switch/parse_ignore_method.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {class_name} {String} {完整类名} {a.b.Class1} 11 | ## {package_name} {String} {完整包名, 不会以.结束} {a.b} 12 | ## {simple_class_name} {String} {简单类名} {Class1} 13 | ## {method_name} {String} {方法名, 不包括括号及方法参数} {method1} 14 | ## {method_arg_num} {int} {方法参数数量} {0, 1} 15 | ## {full_method} {String} {完整方法} {a.b.Class1:f1(), a.b.Class1:f2(int,java.lang.String)} 16 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/exception/ExceptionTargetInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.exception; 2 | 3 | import org.apache.bcel.generic.InstructionHandle; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/10/30 8 | * @description: Exception table的target指令及异常类型 9 | */ 10 | public class ExceptionTargetInfo { 11 | 12 | // Exception table的target指令 13 | private final InstructionHandle target; 14 | 15 | // 异常类型 16 | private final String exceptionType; 17 | 18 | public ExceptionTargetInfo(InstructionHandle target, String exceptionType) { 19 | this.target = target; 20 | this.exceptionType = exceptionType; 21 | } 22 | 23 | public InstructionHandle getTarget() { 24 | return target; 25 | } 26 | 27 | public String getExceptionType() { 28 | return exceptionType; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/thread/JavaCG2UncaughtExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.thread; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2024/3/23 9 | * @description: 10 | */ 11 | public class JavaCG2UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 12 | 13 | private static final Logger logger = LoggerFactory.getLogger(JavaCG2UncaughtExceptionHandler.class); 14 | 15 | private int exceptionCount; 16 | 17 | @Override 18 | public void uncaughtException(Thread t, Throwable e) { 19 | if (e != null) { 20 | exceptionCount++; 21 | logger.error("线程池执行出现未捕获的异常 {} ", t.getName(), e); 22 | } 23 | } 24 | 25 | public int getExceptionCount() { 26 | return exceptionCount; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_other_in_jar_war.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并jar、war中的非jar、war、class文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_other_in_jar_war.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {jar/war文件中的文件相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头} {a/b/c.jar, a/b/c.xml} 11 | ## {file_dir_path} {String} {jar/war文件中的文件所在目录相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头或结尾} {a, a/b} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | ## {file_ext} {String} {非jar、war、class文件后缀, 以.开头} {.xml, .properties} 14 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/exceptions/JavaCG2RuntimeException.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.exceptions; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/2/13 6 | * @description: 7 | */ 8 | public class JavaCG2RuntimeException extends RuntimeException { 9 | public JavaCG2RuntimeException() { 10 | } 11 | 12 | public JavaCG2RuntimeException(String message) { 13 | super(message); 14 | } 15 | 16 | public JavaCG2RuntimeException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public JavaCG2RuntimeException(Throwable cause) { 21 | super(cause); 22 | } 23 | 24 | public JavaCG2RuntimeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 25 | super(message, cause, enableSuppression, writableStackTrace); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_class_in_jar_war.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)指定是否跳过合并jar、war中的class文件 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_class_in_jar_war.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {file_path} {String} {jar/war文件中的文件相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头} {a/b/c.jar, a/b/c.xml} 11 | ## {file_dir_path} {String} {jar/war文件中的文件所在目录相对路径, 相对根目录的路径, 以斜杠/为分隔符,不以分隔符开头或结尾} {a, a/b} 12 | ## {file_name} {String} {文件名称} {a.class, a.xml} 13 | ## {class_file_path} {String} {jar/war文件中的class文件的相对路径, 相对根目录,或WEB-INF/classes、BOOT-INF/classes目录的路径, 以斜杠/为分隔符,不以分隔符开头} {a/b/c.class} 14 | -------------------------------------------------------------------------------- /src/test/java/test/el/fixed/TestElFixedTrue.java: -------------------------------------------------------------------------------- 1 | package test.el.fixed; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import org.junit.Test; 5 | import test.base.TestElBase; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/9/23 10 | * @description: 11 | */ 12 | public class TestElFixedTrue extends TestElBase { 13 | @Override 14 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 15 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR; 16 | } 17 | 18 | @Override 19 | protected String chooseElText() { 20 | return "true"; 21 | } 22 | 23 | @Override 24 | protected String chooseTitle() { 25 | return "合并jar文件时全部忽略"; 26 | } 27 | 28 | @Override 29 | protected String chooseDesc() { 30 | return "在合并目录中的jar文件时,全部不忽略"; 31 | } 32 | 33 | @Test 34 | public void test() { 35 | run(JAR_OUTPUT_DIR); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/test/el/fixed/TestElFixedFalse.java: -------------------------------------------------------------------------------- 1 | package test.el.fixed; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import org.junit.Test; 5 | import test.base.TestElBase; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2025/9/23 10 | * @description: 11 | */ 12 | public class TestElFixedFalse extends TestElBase { 13 | @Override 14 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 15 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR; 16 | } 17 | 18 | @Override 19 | protected String chooseElText() { 20 | return "false"; 21 | } 22 | 23 | @Override 24 | protected String chooseTitle() { 25 | return "合并jar文件时全部不忽略"; 26 | } 27 | 28 | @Override 29 | protected String chooseDesc() { 30 | return "在合并目录中的jar文件时,全部不忽略"; 31 | } 32 | 33 | @Test 34 | public void test() { 35 | run(JAR_OUTPUT_DIR); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/classes/Node4ClassExtendsMethod.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.classes; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2021/6/27 6 | * @description: 处理涉及继承的类的方法时使用的栈的节点 7 | */ 8 | 9 | public class Node4ClassExtendsMethod { 10 | // 父类类名 11 | private final String superClassName; 12 | 13 | // 当前处理的子类序号 14 | private int childClassIndex; 15 | 16 | public Node4ClassExtendsMethod(String superClassName, int childClassIndex) { 17 | this.superClassName = superClassName; 18 | this.childClassIndex = childClassIndex; 19 | } 20 | 21 | // get 22 | public String getSuperClassName() { 23 | return superClassName; 24 | } 25 | 26 | public int getChildClassIndex() { 27 | return childClassIndex; 28 | } 29 | 30 | // set 31 | public void setChildClassIndex(int childClassIndex) { 32 | this.childClassIndex = childClassIndex; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_parse_method_call_switch/parse_ignore_method_call_type_value_caller.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER 2 | ## (作用)在 解析方法调用时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过解析对应的方法调用 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的方法调用 5 | ## (范围)指定解析方法调用被调用对象和参数可能的类型与值需要跳过哪些方法,通过调用方法判断 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_parse_method_call_switch/parse_ignore_method_call_type_value_caller.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {er_class_name} {String} {调用方完整类名} {a.b.Class1} 11 | ## {er_package_name} {String} {调用方完整包名, 不会以.结束} {a.b} 12 | ## {er_simple_class_name} {String} {调用方简单类名} {Class1} 13 | ## {er_method_name} {String} {调用方方法名, 不包括括号及方法参数} {method1} 14 | ## {er_method_arg_num} {int} {调用方方法参数数量} {0, 1} 15 | ## {er_full_method} {String} {调用方完整方法, 包括括号及方法参数} {a.b.Class1:method1(int)} 16 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/comparator/Comparator4MainConfig.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.comparator; 2 | 3 | 4 | import com.adrninistrator.javacg2.conf.enums.interfaces.MainConfigInterface; 5 | 6 | import java.util.Comparator; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2024/8/30 11 | * @description: 12 | */ 13 | public class Comparator4MainConfig implements Comparator { 14 | private static final Comparator4MainConfig INSTANCE = new Comparator4MainConfig(); 15 | 16 | public static Comparator4MainConfig getInstance() { 17 | return INSTANCE; 18 | } 19 | 20 | private Comparator4MainConfig() { 21 | } 22 | 23 | @Override 24 | public int compare(MainConfigInterface o1, MainConfigInterface o2) { 25 | int r1 = o1.getFileName().compareTo(o2.getFileName()); 26 | if (r1 != 0) { 27 | return r1; 28 | } 29 | 30 | return o1.getKey().compareTo(o2.getKey()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/field/ClassField.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.field; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/2/21 6 | * @description: 类中的字段 7 | */ 8 | public class ClassField { 9 | 10 | // 类名 11 | private String className; 12 | 13 | // 字段名称 14 | private String fieldName; 15 | 16 | // 字段类型 17 | private String fieldType; 18 | 19 | public String getClassName() { 20 | return className; 21 | } 22 | 23 | public void setClassName(String className) { 24 | this.className = className; 25 | } 26 | 27 | public String getFieldName() { 28 | return fieldName; 29 | } 30 | 31 | public void setFieldName(String fieldName) { 32 | this.fieldName = fieldName; 33 | } 34 | 35 | public String getFieldType() { 36 | return fieldType; 37 | } 38 | 39 | public void setFieldType(String fieldType) { 40 | this.fieldType = fieldType; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/classes/InnerClassInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.classes; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/3/25 6 | * @description: 内部类信息 7 | */ 8 | public class InnerClassInfo { 9 | // 内部类名 10 | private final String innerClassName; 11 | 12 | // 外部类名 13 | private final String outerClassName; 14 | 15 | // 是否为匿名内部类 16 | private final boolean anonymousClass; 17 | 18 | public InnerClassInfo(String innerClassName, String outerClassName, boolean anonymousClass) { 19 | this.innerClassName = innerClassName; 20 | this.outerClassName = outerClassName; 21 | this.anonymousClass = anonymousClass; 22 | } 23 | 24 | public String getInnerClassName() { 25 | return innerClassName; 26 | } 27 | 28 | public String getOuterClassName() { 29 | return outerClassName; 30 | } 31 | 32 | public boolean isAnonymousClass() { 33 | return anonymousClass; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/exception/CatchInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.exception; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2023/12/28 9 | * @description: Exception table中的catch信息 10 | */ 11 | public class CatchInfo extends FinallyInfo { 12 | 13 | private final List catchExceptionTypeList; 14 | 15 | public CatchInfo(int fromPosition, int toPosition, int endPosition, int targetPosition, String catchExceptionType) { 16 | super(fromPosition, toPosition, endPosition, targetPosition); 17 | catchExceptionTypeList = new ArrayList<>(1); 18 | catchExceptionTypeList.add(catchExceptionType); 19 | } 20 | 21 | public void addCatchExceptionType(String catchExceptionType) { 22 | catchExceptionTypeList.add(catchExceptionType); 23 | } 24 | 25 | public List getCatchExceptionTypeList() { 26 | return catchExceptionTypeList; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/codeparser/JarEntryOtherFileParser.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.codeparser; 2 | 3 | import java.io.InputStream; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2023/2/16 8 | * @description: 对jar文件中的其他文件解析类的接口 9 | */ 10 | public interface JarEntryOtherFileParser extends CodeParserInterface { 11 | 12 | /** 13 | * 返回需要处理jar文件中的其他文件的后缀数组(除.class文件外),忽略大小写,不需要以"."开头,例如"xml" 14 | * 若需要使以下 parseJarEntryOtherFile() 方法被调用,则当前方法需要返回对应的文件后缀数组 15 | */ 16 | String[] chooseJarEntryOtherFileExt(); 17 | 18 | /** 19 | * 处理jar文件中的文件(除class文件外) 20 | * 仅当以上 chooseJarEntryOtherFileExt() 方法返回的数组中包含当前文件后缀时,才会调用当前方法 21 | * 22 | * @param inputStream 当前文件对应的输入流 23 | * @param jarEntryPath 当前文件在jar文件中的路径 24 | * @param jarEntryName 当前文件在jar文件中的名称 25 | * @return true: 处理成功 false: 处理失败 26 | */ 27 | boolean parseJarEntryOtherFile(InputStream inputStream, String jarEntryPath, String jarEntryName); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import com.adrninistrator.javacg2.el.enums.interfaces.ElConfigInterface; 5 | import com.adrninistrator.javacg2.el.manager.AbstractElManager; 6 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/2/13 11 | * @description: 当前项目使用的表达式检查抽象父类 12 | */ 13 | public abstract class JavaCG2ElChecker extends AbstractElChecker { 14 | 15 | @Override 16 | protected void doCheck(AbstractElManager elManager, ElConfigInterface elConfig) { 17 | javaCG2DoCheck((JavaCG2ElManager) elManager, (JavaCG2ElConfigEnum) elConfig); 18 | } 19 | 20 | /** 21 | * 执行检查表达式 22 | * 23 | * @param elManager 24 | * @param elConfig 25 | */ 26 | protected abstract void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/counter/JavaCG2Counter.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.counter; 2 | 3 | /** 4 | * @author Adrninistrator 5 | * @date 2021/8/10 6 | * @description: 计数器 7 | */ 8 | public class JavaCG2Counter { 9 | private int count; 10 | 11 | public JavaCG2Counter() { 12 | this(0); 13 | } 14 | 15 | public JavaCG2Counter(int count) { 16 | this.count = count; 17 | } 18 | 19 | // 计数加1后返回 20 | public int addAndGet() { 21 | return ++count; 22 | } 23 | 24 | // 计数增加指定数量后返回 25 | public int addAndGet(int num) { 26 | return count += num; 27 | } 28 | 29 | // 计数减 1后返回 30 | public int minusAndGet() { 31 | return --count; 32 | } 33 | 34 | // 35 | public int getCount() { 36 | return count; 37 | } 38 | 39 | public void setCount(int count) { 40 | this.count = count; 41 | } 42 | 43 | @Override 44 | public String toString() { 45 | return "count=" + count; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/common/enums/JavaCG2FieldRelationshipTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.common.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/8/6 6 | * @description: 通过get/set方法关联的字段关联类型 7 | */ 8 | public enum JavaCG2FieldRelationshipTypeEnum { 9 | FRTE_DIRECTLY("DI", "字段直接赋值"), 10 | FRTE_DIRECTLY_EQUIVALENT_CONVERSION("DI_EQC", "字段经过等值转换直接赋值"), 11 | FRTE_BEAN_UTIL("BU", "通过BeanUtil等方法拷贝赋值"), 12 | FRTE_MYBATIS_MAPPER_ARG_DB("MMAD", "MyBatis Mapper方法参数对应数据库字段"), 13 | FRTE_METHOD_CALL_PASSED("MCP", "通过方法调用传递的字段赋值"), 14 | FRTE_METHOD_CALL_PASSED_EQC("MCP_EQC", "字段经过等值转换,通过方法调用传递的字段赋值"), 15 | ; 16 | 17 | private final String type; 18 | private final String desc; 19 | 20 | JavaCG2FieldRelationshipTypeEnum(String type, String desc) { 21 | this.type = type; 22 | this.desc = desc; 23 | } 24 | 25 | public String getType() { 26 | return type; 27 | } 28 | 29 | public String getDesc() { 30 | return desc; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/output/JavaCG2OtherRunResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.output; 2 | 3 | import java.util.Collections; 4 | import java.util.HashSet; 5 | import java.util.Set; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2024/11/4 10 | * @description: 其他执行结果 11 | */ 12 | public class JavaCG2OtherRunResult { 13 | 14 | // 栈桢信息快照数量超过允许的最大数量的方法Set 15 | private final Set frameSnapshotNumExceedMethodSet = new HashSet<>(); 16 | 17 | public void addFrameSnapshotNumExceedMethod(String frameSnapshotNumExceedMethod) { 18 | frameSnapshotNumExceedMethodSet.add(frameSnapshotNumExceedMethod); 19 | } 20 | 21 | public void addFrameSnapshotNumExceedMethodSet(Set frameSnapshotNumExceedMethodSet) { 22 | this.frameSnapshotNumExceedMethodSet.addAll(frameSnapshotNumExceedMethodSet); 23 | } 24 | 25 | public Set getFrameSnapshotNumExceedMethodSetReadOnly() { 26 | return Collections.unmodifiableSet(frameSnapshotNumExceedMethodSet); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/function/AbstractStringFunctionTwoArgs.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.function; 2 | 3 | import com.adrninistrator.javacg2.el.util.JavaCG2ElUtil; 4 | import com.googlecode.aviator.runtime.function.AbstractFunction; 5 | import com.googlecode.aviator.runtime.type.AviatorBoolean; 6 | import com.googlecode.aviator.runtime.type.AviatorObject; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author adrninistrator 12 | * @date 2025/2/22 13 | * @description: 14 | */ 15 | public abstract class AbstractStringFunctionTwoArgs extends AbstractFunction { 16 | 17 | protected abstract boolean checkString(String argSrc, String argDst); 18 | 19 | @Override 20 | public AviatorObject call(Map env, AviatorObject arg1, AviatorObject arg2) { 21 | String target = JavaCG2ElUtil.getArgStringValue(arg1, env); 22 | String param = JavaCG2ElUtil.getArgStringValue(arg2, env); 23 | 24 | return checkString(target, param) ? AviatorBoolean.TRUE : AviatorBoolean.FALSE; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/element/constant/ConstElement.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.element.constant; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import com.adrninistrator.javacg2.dto.element.BaseElement; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/13 9 | * @description: 常量基类 10 | */ 11 | public abstract class ConstElement extends BaseElement { 12 | 13 | ConstElement(Object value) { 14 | if (value != null) { 15 | this.value = value; 16 | } 17 | } 18 | 19 | /** 20 | * 返回当前常量的类型 21 | * 22 | * @return 23 | */ 24 | public JavaCG2ConstantTypeEnum getConstantTypeEnum() { 25 | return null; 26 | } 27 | 28 | @Override 29 | public String getType() { 30 | JavaCG2ConstantTypeEnum javaCG2ConstantTypeEnum = getConstantTypeEnum(); 31 | if (javaCG2ConstantTypeEnum == null) { 32 | return null; 33 | } 34 | return javaCG2ConstantTypeEnum.getType(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/comparator/Comparator4MethodArgReturnTypes.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.comparator; 2 | 3 | import com.adrninistrator.javacg2.dto.method.MethodArgReturnTypes; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2022/11/26 10 | * @description: 11 | */ 12 | public class Comparator4MethodArgReturnTypes implements Comparator { 13 | private static final Comparator4MethodArgReturnTypes INSTANCE = new Comparator4MethodArgReturnTypes(); 14 | 15 | public static Comparator4MethodArgReturnTypes getInstance() { 16 | return INSTANCE; 17 | } 18 | 19 | private Comparator4MethodArgReturnTypes() { 20 | } 21 | 22 | @Override 23 | public int compare(MethodArgReturnTypes o1, MethodArgReturnTypes o2) { 24 | int result1 = o1.getMethodName().compareTo(o2.getMethodName()); 25 | if (result1 != 0) { 26 | return result1; 27 | } 28 | 29 | return o1.getMethodArgTypes().compareTo(o2.getMethodArgTypes()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/variabledatasource/VariableDataSourceField.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.variabledatasource; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2024/6/10 6 | * @description: 变量的数据来源,使用字段 7 | */ 8 | public class VariableDataSourceField extends AbstractVariableDataSource { 9 | 10 | // 类名 11 | private String className; 12 | 13 | // 字段名称 14 | private String fieldName; 15 | 16 | // 字段类型 17 | private String fieldType; 18 | 19 | public String getClassName() { 20 | return className; 21 | } 22 | 23 | public void setClassName(String className) { 24 | this.className = className; 25 | } 26 | 27 | public String getFieldName() { 28 | return fieldName; 29 | } 30 | 31 | public void setFieldName(String fieldName) { 32 | this.fieldName = fieldName; 33 | } 34 | 35 | public String getFieldType() { 36 | return fieldType; 37 | } 38 | 39 | public void setFieldType(String fieldType) { 40 | this.fieldType = fieldType; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_merge_file_switch/ignore_jar_war_by_class_dir_prefix.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_WAR_BY_CLASS_DIR_PREFIX 2 | ## (作用)在 合并需要解析的目录或jar/war文件时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过合并(及解析)对应的文件 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的文件 5 | ## (范围)通过class文件对应指定层级的目录路径判断是否跳过合并当前jar、war文件 6 | ## (范围)相当于通过jar、war文件中类的包名控制是否跳过合并当前jar、war文件 7 | ## (范围)以下参数为jar、war文件中的class文件对应指定层级的目录路径集合。在表达式中可通过“include”方法判断集合中是否包含指定元素 8 | ## (范围)集合中的元素类型为字符串,以/作为分隔符,不会以分隔符开头或结尾 9 | ## (范围)例如jar文件中有a1/c1.class、a2/b2/c2.class,则该jar文件中的class文件目录1级路径有a1、a2,2级路径有a2/b2,没有层级大于2级的路径 10 | ## (范围)在使用以下 class_dir_prefix_level_ 参数时,需要以 class_dir_prefix_level_ 开头,后续通过数字指定class文件路径层级 11 | ## (范围)例如 class_dir_prefix_level_3 代表第3级class文件路径集合 12 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 13 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 14 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_merge_file_switch/ignore_jar_war_by_class_dir_prefix.av.md 15 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 16 | ## {class_dir_prefix_level_} {Set} {jar/war文件中的class文件对应指定层级的目录路径集合} {集合:('a'), 集合:('a', 'a/b')} 17 | -------------------------------------------------------------------------------- /docs/call_type.md: -------------------------------------------------------------------------------- 1 | # 1. 方法调用类型 2 | 3 | |类型|描述| 4 | |---|---| 5 | |VIR|JVM的原始方法指令: INVOKEVIRTUAL| 6 | |INT|JVM的原始方法指令: INVOKEINTERFACE| 7 | |SPE|JVM的原始方法指令: INVOKESPECIAL| 8 | |STA|JVM的原始方法指令: INVOKESTATIC| 9 | |DYN|JVM的原始方法指令: INVOKEDYNAMIC| 10 | |_SPR_ACT_I|被调用接口为 Spring Bean ,替换为实际的实现类类型| 11 | |_SPR_ACT_C|被调用类为 Spring Bean ,替换为实际的子类类型| 12 | |_ACT_I|被调用接口替换为实际的实现类类型| 13 | |_ACT_C|被调用类替换为实际的子类类型| 14 | |_ITF|接口调用实现类对应的方法| 15 | |_BSM|INVOKEDYNAMIC指令调用的BootstrapMethod| 16 | |_LM|Lambda表达式| 17 | |_RIR1|其他方法调用Runnable 构造函数| 18 | |_RIR2|Runnable 构造函数调用 run() 方法| 19 | |_CIC1|其他方法调用Callable 构造函数| 20 | |_CIC2|Callable 构造函数调用 call() 方法| 21 | |_TCID1|其他方法调用 TransactionCallback 构造函数| 22 | |_TCID2|TransactionCallback 构造函数调用 doInTransaction() 方法| 23 | |_TCWRID1|其他方法调用 TransactionCallbackWithoutResult 构造函数| 24 | |_TCWRID2|TransactionCallbackWithoutResult 构造函数调用 doInTransactionWithoutResult() 方法| 25 | |_TSR|Thread start() 方法调用 run() 方法| 26 | |_SCC|父类调用子类对应的方法| 27 | |_CCS|子类调用父类对应的方法| 28 | |_CCS_SPE|子类通过super.调用父类方法| 29 | |_CCS_I|子接口调用父接口对应的方法| 30 | |_CCID|实现类调用接口对应的default方法| 31 | |_ICID|子接口调用父接口对应的default方法| 32 | |_MA|人工添加的方法调用| 33 | |_MAA|通过方法注解添加的调用关系| 34 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodMethodArgNum.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/28 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodMethodArgNum extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_METHOD_ARG_NUM.getVariableName() + " != 4"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析方法判断方法参数数量"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法时,判断方法参数数量是否等于指定值,仅处理匹配的方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/InvokeInstructionPosAndCallee.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/8/4 6 | * @description: 方法调用指令位置及被调用方法 7 | */ 8 | public class InvokeInstructionPosAndCallee { 9 | 10 | // 方法调用序号 11 | private final int invokeInstructionPosition; 12 | 13 | // 被调用者类名 14 | private final String calleeClassName; 15 | 16 | // 被调用者方法名 17 | private final String calleeMethodName; 18 | 19 | public InvokeInstructionPosAndCallee(int invokeInstructionPosition, String calleeClassName, String calleeMethodName) { 20 | this.invokeInstructionPosition = invokeInstructionPosition; 21 | this.calleeClassName = calleeClassName; 22 | this.calleeMethodName = calleeMethodName; 23 | } 24 | 25 | public int getInvokeInstructionPosition() { 26 | return invokeInstructionPosition; 27 | } 28 | 29 | public String getCalleeClassName() { 30 | return calleeClassName; 31 | } 32 | 33 | public String getCalleeMethodName() { 34 | return calleeMethodName; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreClassPackageName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassPackageName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_PACKAGE_NAME.getVariableName() + " != 'test.callgraph.annotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析类判断包名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析类时,判断包名是否等于指定关键字,仅处理匹配的类"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEeMethodName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEeMethodName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_METHOD_NAME.getVariableName() + " != 'test5'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用方法名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用方法名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErMethodName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErMethodName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_METHOD_NAME.getVariableName() + " != 'test5'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用方法名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用方法名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/jar/ClassAndJarNum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.jar; 2 | 3 | import com.adrninistrator.javacg2.common.JavaCG2Constants; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2023/4/18 11 | * @description: 类名及对应的Jar包序号 12 | */ 13 | public class ClassAndJarNum { 14 | 15 | private final Map classAndJarNumMap = new HashMap<>(JavaCG2Constants.SIZE_100); 16 | 17 | /** 18 | * 根据类名获取对应的Jar包序号,若不存在则返回代表为空的Jar包序号 19 | * 20 | * @param className 21 | * @return 22 | */ 23 | public String getJarNum(String className) { 24 | Integer classJarNum = classAndJarNumMap.get(className); 25 | return classJarNum == null ? JavaCG2Constants.EMPTY_JAR_NUM : String.valueOf(classJarNum); 26 | } 27 | 28 | /** 29 | * 记录类名及对应的Jar包序号 30 | * 31 | * @param className 32 | * @param jarNum 33 | */ 34 | public void put(String className, Integer jarNum) { 35 | // 只记录每个类所出现的最靠前的Jar包序号,不覆盖现有值 36 | classAndJarNumMap.putIfAbsent(className, jarNum); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreClassSimpleClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassSimpleClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_SIMPLE_CLASS_NAME.getVariableName() + " != 'ArgCalleeTypeService1'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析类判断简单类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析类时,判断简单类名是否等于指定关键字,仅处理匹配的类"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodPackageName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodPackageName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_PACKAGE_NAME.getVariableName() + " != 'test.callgraph.annotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析方法判断类的包名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法时,判断类的包名是否等于指定关键字,仅处理匹配的方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInDirOFE.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInDirOFE extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_OTHER_FILE_EXT.getVariableName() + " == '.xml'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的其他文件判断文件后缀"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的其他文件时,判断文件后缀是否等于指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEeMethodArgNum.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEeMethodArgNum extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_METHOD_ARG_NUM.getVariableName() + " != 5"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用方法参数数量"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用方法参数数量是否等于指定值,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErMethodArgNum.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErMethodArgNum extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_METHOD_ARG_NUM.getVariableName() + " != 5"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用方法参数数量"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用方法参数数量是否等于指定值,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodSimpleClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodSimpleClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_SIMPLE_CLASS_NAME.getVariableName() + " != 'ArgCalleeTypeService1'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析方法判断简单类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法时,判断简单类名是否等于指定关键字,仅处理匹配的方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreClassClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析类判断类名等于关键字"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析类时,判断类名是否等于指定关键字,仅处理匹配的类"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreWarInDirFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreWarInDirFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_WAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", '.war')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的war文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的war文件时,判断文件名是否以指定关键字结尾,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析方法判断类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法时,判断类名是否以指定关键字开头,仅处理匹配的方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodFullMethod.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/28 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodFullMethod extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_FULL_METHOD.getVariableName() + " != 'test.callgraph.implement.AbstractClass1:test()'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "解析方法判断完整方法"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法时,判断完整方法是否等于指定关键字,仅处理匹配的方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInDirFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInDirFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'bcel-')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的jar文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的jar文件时,判断文件名是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInDirFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInDirFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", '.xml')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的其他文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的其他文件时,判断文件名是否以指定关键字结尾,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInJarOFE.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInJarOFE extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_OTHER_FILE_EXT.getVariableName() + " != '.MF'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的其他文件判断文件后缀"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的其他文件时,判断文件后缀是否等于指定关键字,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInWarOFE.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInWarOFE extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_OTHER_FILE_EXT.getVariableName() + " != '.MF'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的其他文件判断文件后缀"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的其他文件时,判断文件后缀是否等于指定关键字,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErPackageName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErPackageName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_PACKAGE_NAME.getVariableName() + " != 'test.callgraph.annotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用类包名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用类包名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEePackageName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEePackageName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_PACKAGE_NAME.getVariableName() + " != 'test.callgraph.annotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用类包名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用类包名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/copy/javassist/bytecode/BadBytecode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Javassist, a Java-bytecode translator toolkit. 3 | * Copyright (C) 1999- Shigeru Chiba. All Rights Reserved. 4 | * 5 | * The contents of this file are subject to the Mozilla Public License Version 6 | * 1.1 (the "License"); you may not use this file except in compliance with 7 | * the License. Alternatively, the contents of this file may be used under 8 | * the terms of the GNU Lesser General Public License Version 2.1 or later, 9 | * or the Apache License Version 2.0. 10 | * 11 | * Software distributed under the License is distributed on an "AS IS" basis, 12 | * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 13 | * for the specific language governing rights and limitations under the 14 | * License. 15 | */ 16 | 17 | package copy.javassist.bytecode; 18 | 19 | /** 20 | * Signals that a bad bytecode sequence has been found. 21 | */ 22 | public class BadBytecode extends Exception { 23 | /** 24 | * default serialVersionUID 25 | */ 26 | private static final long serialVersionUID = 1L; 27 | 28 | public BadBytecode(String msg) { 29 | super(msg); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInDirFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInDirFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'TestEl')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的class文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的class文件时,判断文件名是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInJarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInJarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'bcel-')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的jar文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的jar文件时,判断文件名是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInWarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInWarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'bcel-')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的jar文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的jar文件时,判断文件名是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInJarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInJarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", '.MF')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的其他文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的其他文件时,判断文件名是否以指定关键字结尾,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInWarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInWarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", '.MF')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的其他文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的其他文件时,判断文件名是否以指定关键字结尾,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/common/TypeConstants.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.common; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2ConstantTypeEnum; 4 | import org.apache.bcel.Const; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/5/14 9 | * @description: 10 | */ 11 | public class TypeConstants { 12 | // 与int兼容的类型 13 | public static final String[] COMPATIBLE_INT_TYPES = new String[]{ 14 | JavaCG2ConstantTypeEnum.CONSTTE_BOOLEAN.getType(), 15 | JavaCG2ConstantTypeEnum.CONSTTE_BYTE.getType(), 16 | JavaCG2ConstantTypeEnum.CONSTTE_SHORT.getType(), 17 | JavaCG2ConstantTypeEnum.CONSTTE_CHAR.getType(), 18 | }; 19 | 20 | public static final String BYTE_ARRAY_TYPE = JavaCG2ConstantTypeEnum.CONSTTE_BYTE.getType() + JavaCG2Constants.FLAG_ARRAY; 21 | public static final String BOOLEAN_ARRAY_TYPE = JavaCG2ConstantTypeEnum.CONSTTE_BOOLEAN.getType() + JavaCG2Constants.FLAG_ARRAY; 22 | 23 | public static final short[] GOTO_OPCODES = new short[]{Const.GOTO, Const.GOTO_W}; 24 | 25 | private TypeConstants() { 26 | throw new IllegalStateException("illegal"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/java/test/el/handlespbinxml/TestElHandleIgnoreSPBInXmlClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.handlespbinxml; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/18 11 | * @description: 12 | */ 13 | public class TestElHandleIgnoreSPBInXmlClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_HANDLE_IGNORE_SPRING_BEAN_IN_XML; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_SPB_CLASS_NAME.getVariableName() + " != 'a.b.C'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "XML中的Spring Bean判断类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在处理XML文件中的Spring Bean时,判断类名是否等于指定关键字,仅处理匹配的Spring Bean"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/handlespbinxml/TestElHandleIgnoreSPBInXmlProfile.java: -------------------------------------------------------------------------------- 1 | package test.el.handlespbinxml; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/18 11 | * @description: 12 | */ 13 | public class TestElHandleIgnoreSPBInXmlProfile extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_HANDLE_IGNORE_SPRING_BEAN_IN_XML; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_SPB_PROFILE.getVariableName() + " != 'dev'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "XML中的Spring Bean判断profile"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在处理XML文件中的Spring Bean时,判断profile是否等于指定关键字,仅处理匹配的Spring Bean"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErSimpleClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErSimpleClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_SIMPLE_CLASS_NAME.getVariableName() + " != 'ArgCalleeTypeService1'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用简单类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用简单类名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInJarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInJarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'Test')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的class文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的class文件时,判断文件名是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInWarFN.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInWarFN extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_NAME.getVariableName() + ", 'Test')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的class文件判断文件名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的class文件时,判断文件名是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEeClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEeClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_CLASS_NAME.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用类名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_CLASS_NAME.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用类名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/handlespbinxml/TestElHandleIgnoreSPBInXmlBeanName.java: -------------------------------------------------------------------------------- 1 | package test.el.handlespbinxml; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/18 11 | * @description: 12 | */ 13 | public class TestElHandleIgnoreSPBInXmlBeanName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_HANDLE_IGNORE_SPRING_BEAN_IN_XML; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_SPB_BEAN_NAME.getVariableName() + " != 'testService1'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "XML中的Spring Bean判断Bean名称"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在处理XML文件中的Spring Bean时,判断Bean名称是否等于指定关键字,仅处理匹配的Spring Bean"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreWarInDirAFPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreWarInDirAFPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_WAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_PATH_IN_DIR.getVariableName() + ", '/build/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的war文件判断文件绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的war文件时,判断文件绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInDirAFPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInDirAFPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_PATH_IN_DIR.getVariableName() + ", '/lib/bcel-')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的jar文件判断文件绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的jar文件时,判断文件绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInJarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInJarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + " == 'lib'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的jar文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的jar文件时,判断文件所在目录相对路径(相对根目录)是否等于指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInJarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInJarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'lib/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的jar文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的jar文件时,判断文件相对路径是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInWarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInWarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", '/lib/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的jar文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的jar文件时,判断文件相对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEeSimpleClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEeSimpleClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_SIMPLE_CLASS_NAME.getVariableName() + " != '" + Object.class.getSimpleName() + "'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用简单类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用简单类名是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docs/file_desc.md: -------------------------------------------------------------------------------- 1 | # 1. 生成文件说明 2 | 3 | |序号|文件内容| 4 | |---|---| 5 | |1|Java代码中定义的Spring AOP Advice| 6 | |2|Java代码中定义的Spring AOP Aspect| 7 | |3|Java代码中定义的Spring AOP Pointcut| 8 | |4|Java代码中定义的Spring的包扫描路径| 9 | |5|Lambda表达式方法信息| 10 | |6|Spring Bean信息| 11 | |7|dto的get方法及字段| 12 | |8|dto的set方法及字段| 13 | |9|jar文件信息| 14 | |10|java-callgraph2组件使用的配置参数| 15 | |11|static、final字段初始化方法信息(含枚举)| 16 | |12|使用其他类中字段的使用情况| 17 | |13|内部类信息| 18 | |14|包名信息| 19 | |15|字段信息| 20 | |16|字段的注解| 21 | |17|引用的类| 22 | |18|方法代码行号| 23 | |19|方法参数| 24 | |20|方法参数的注解| 25 | |21|方法参数集合中涉及的泛型类型| 26 | |22|方法的catch信息| 27 | |23|方法的finally信息| 28 | |24|方法的信息| 29 | |25|方法的注解| 30 | |26|方法调用| 31 | |27|方法调用使用方法调用返回值| 32 | |28|方法调用使用静态字段信息| 33 | |29|方法调用使用静态字段方法调用返回值| 34 | |30|方法调用使用非静态字段信息| 35 | |31|方法调用的信息| 36 | |32|方法调用被调用对象的原始类型| 37 | |33|方法返回值对应的参数序号| 38 | |34|方法返回值对应的方法调用ID| 39 | |35|方法返回的字段(含枚举)| 40 | |36|方法返回的常量值(含null)| 41 | |37|方法返回集合中涉及的泛型类型| 42 | |38|方法通过throw抛出的异常信息| 43 | |39|日志-方法处理耗时| 44 | |40|枚举类初始化赋值信息| 45 | |41|枚举类构造函数参数与字段赋值关系| 46 | |42|类的信息| 47 | |43|类的注解| 48 | |44|类的签名中的泛型信息| 49 | |45|类的继承或实现的泛型信息| 50 | |46|继承与实现相关信息| 51 | |47|通过get/set方法关联的字段关系| 52 | |48|重复同名类引用的类| 53 | |49|重复同名类的信息| 54 | |50|重复同名类的字段的信息| 55 | |51|重复同名类的方法的信息| 56 | |52|非静态字段集合中涉及的泛型类型| 57 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInWarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInWarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + " == 'WEB-INF/lib'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的jar文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的jar文件时,判断文件所在目录相对路径(相对根目录)是否等于指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallEeFullMethod.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallEeFullMethod extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_EE_FULL_METHOD.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation:test1()'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断被调用完整方法"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断被调用完整方法是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallErFullMethod.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallErFullMethod extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_FULL_METHOD.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation:test1()'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用判断调用完整方法"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用时,判断调用完整方法是否等于指定关键字,仅处理匹配的方法调用"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarInDirAFDPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarInDirAFDPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_DIR_PATH_IN_DIR.getVariableName() + ", '/lib')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的jar文件判断文件所在目录绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的jar文件时,判断文件所在目录绝对路径是否以指定关键字结尾,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInDirAFPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInDirAFPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_PATH_IN_DIR.getVariableName() + ", '/out/test/resources/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的其他文件判断文件绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的其他文件时,判断文件绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInJarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInJarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + " != 'META-INF'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的其他文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的其他文件文件时,判断文件所在目录相对路径(相对根目录)是否等于指定关键字,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInWarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInWarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + " != 'META-INF'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的其他文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的其他文件文件时,判断文件所在目录相对路径(相对根目录)是否等于指定关键字,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreWarInDirAFDPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreWarInDirAFDPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_WAR_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_DIR_PATH_IN_DIR.getVariableName() + ", '/build')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的war文件判断文件所在目录绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的war文件时,判断文件所在目录绝对路径是否以指定关键字结尾,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInJarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInJarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的class文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的class文件时,判断文件相对路径是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInJarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInJarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'META-INF/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的其他文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的其他文件时,判断文件相对路径是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInWarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInWarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'META-INF/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的其他文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的其他文件时,判断文件相对路径是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInDirAFPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInDirAFPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_PATH_IN_DIR.getVariableName() + ", '/out/test/classes/test/el/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的class文件判断文件绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的class文件时,判断文件绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreOtherInDirAFDPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreOtherInDirAFDPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_DIR_PATH_IN_DIR.getVariableName() + ", '/out/test/resources')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的其他文件判断文件所在目录绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的其他文件时,判断文件所在目录绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErMethodName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErMethodName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_METHOD_NAME.getVariableName() + " != 'test5'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用方法名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用方法名是否等于指定关键字,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInWarFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInWarFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'WEB-INF/classes/test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的class文件判断文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的class文件时,判断文件相对路径是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErMethodArgNum.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErMethodArgNum extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_METHOD_ARG_NUM.getVariableName() + " != 5"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用方法参数数量"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用方法参数数量是否等于指定值,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInJarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInJarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + ", 'test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的class文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的class文件时,判断文件所在目录相对路径(相对根目录)是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInDirAFDPID.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/23 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInDirAFDPID extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_DIR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_ABSOLUTE_FILE_DIR_PATH_IN_DIR.getVariableName() + ", '/out/test/classes/test/el/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并目录中的class文件判断文件所在目录绝对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并目录中的class文件时,判断文件所在目录绝对路径是否包含指定关键字,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(OUT_TEST_DIR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErPackageName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErPackageName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_PACKAGE_NAME.getVariableName() + " != 'test.callgraph.annotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用类包名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用类包名是否等于指定关键字,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/classmethod/TestElParseIgnoreMethodMethodName.java: -------------------------------------------------------------------------------- 1 | package test.el.classmethod; 2 | 3 | import com.adrninistrator.javacg2.common.JavaCG2CommonNameConstants; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 5 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 6 | import org.junit.Test; 7 | import test.base.TestElBase; 8 | 9 | /** 10 | * @author adrninistrator 11 | * @date 2025/9/24 12 | * @description: 13 | */ 14 | public class TestElParseIgnoreMethodMethodName extends TestElBase { 15 | @Override 16 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 17 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD; 18 | } 19 | 20 | @Override 21 | protected String chooseElText() { 22 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_METHOD_NAME.getVariableName() + " != '" + JavaCG2CommonNameConstants.METHOD_NAME_INIT + "'"; 23 | } 24 | 25 | @Override 26 | protected String chooseTitle() { 27 | return "解析方法判断方法名"; 28 | } 29 | 30 | @Override 31 | protected String chooseDesc() { 32 | return "在解析方法时,判断方法名是否等于指定关键字,仅处理匹配的方法"; 33 | } 34 | 35 | @Test 36 | public void test() { 37 | run(null); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInWarFDPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInWarFDPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_FILE_DIR_PATH_IN_JAR_WAR.getVariableName() + ", 'WEB-INF/classes/test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的class文件判断文件所在目录相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的class文件时,判断文件所在目录相对路径(相对根目录)是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/extensions/annotationattributes/DefaultAnnotationAttributesFormatter.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.extensions.annotationattributes; 2 | 3 | import com.adrninistrator.javacg2.common.JavaCG2Constants; 4 | import org.apache.bcel.classfile.ElementValuePair; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2022/8/28 9 | * @description: 10 | */ 11 | public class DefaultAnnotationAttributesFormatter implements AnnotationAttributesFormatterInterface { 12 | 13 | @Override 14 | public String format(ElementValuePair elementValuePair) { 15 | return encodeAnnotationValue(elementValuePair.getValue().toString()); 16 | } 17 | 18 | public static String encodeAnnotationValue(String value) { 19 | return value.replace('\r', JavaCG2Constants.ANNOTATION_ATTRIBUTE_VALUE_REPLACE_CARRIAGE_RETURN) 20 | .replace('\n', JavaCG2Constants.ANNOTATION_ATTRIBUTE_VALUE_REPLACE_LINE_FEED); 21 | } 22 | 23 | public static String decodeAnnotationValue(String value) { 24 | return value.replace(JavaCG2Constants.ANNOTATION_ATTRIBUTE_VALUE_REPLACE_CARRIAGE_RETURN, '\r') 25 | .replace(JavaCG2Constants.ANNOTATION_ATTRIBUTE_VALUE_REPLACE_LINE_FEED, '\n'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErSimpleClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErSimpleClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_SIMPLE_CLASS_NAME.getVariableName() + " != 'ArgCalleeTypeService1'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用简单类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用简单类名是否等于指定关键字,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/MethodCallParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import com.adrninistrator.javacg2.dto.element.BaseElement; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2022/5/22 10 | * @description: 方法调用指令解析结果 11 | */ 12 | public class MethodCallParseResult extends BaseInstructionParseResult { 13 | 14 | // 方法调用对应的被调用对象 15 | private final BaseElement objectElement; 16 | 17 | // 方法调用对应的参数 18 | private final List argumentList; 19 | 20 | public MethodCallParseResult(BaseElement objectElement, List argumentList) { 21 | this.objectElement = objectElement; 22 | this.argumentList = argumentList; 23 | } 24 | 25 | public BaseElement getObjectElement() { 26 | return objectElement; 27 | } 28 | 29 | public List getArgumentList() { 30 | return argumentList; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return "MethodCallObjRefAndArgs{" + 36 | "objectReference=" + objectElement + 37 | ", argumentList=" + argumentList + 38 | '}'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/spring/SpringBeanInJava.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.spring; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2025/6/18 8 | * @description: Java代码中定义的Spring Bean信息 9 | */ 10 | public class SpringBeanInJava { 11 | 12 | // Spring Bean可能的类名 13 | private List classNameList; 14 | 15 | // Spring Bean定义时使用的注解类名 16 | private String annotationClassName; 17 | 18 | // Spring Bean定义时所在的类名 19 | private String defineClassName; 20 | 21 | public List getClassNameList() { 22 | return classNameList; 23 | } 24 | 25 | public void setClassNameList(List classNameList) { 26 | this.classNameList = classNameList; 27 | } 28 | 29 | public String getAnnotationClassName() { 30 | return annotationClassName; 31 | } 32 | 33 | public void setAnnotationClassName(String annotationClassName) { 34 | this.annotationClassName = annotationClassName; 35 | } 36 | 37 | public String getDefineClassName() { 38 | return defineClassName; 39 | } 40 | 41 | public void setDefineClassName(String defineClassName) { 42 | this.defineClassName = defineClassName; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErClassName.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErClassName extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_CLASS_NAME.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用类名"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用类名是否等于指定关键字,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/PutFieldParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import com.adrninistrator.javacg2.dto.element.BaseElement; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2023/7/16 8 | * @description: PUTFIELD指令解析结果 9 | */ 10 | public class PutFieldParseResult extends BaseInstructionParseResult { 11 | 12 | // 字段名称 13 | private final String fieldName; 14 | 15 | // 字段类型 16 | private final String fieldType; 17 | 18 | // 对应的值 19 | private final BaseElement value; 20 | 21 | // 对应的对象 22 | private final BaseElement object; 23 | 24 | public PutFieldParseResult(String fieldName, String fieldType, BaseElement value, BaseElement object) { 25 | this.fieldName = fieldName; 26 | this.fieldType = fieldType; 27 | this.value = value; 28 | this.object = object; 29 | } 30 | 31 | public String getFieldName() { 32 | return fieldName; 33 | } 34 | 35 | public String getFieldType() { 36 | return fieldType; 37 | } 38 | 39 | public BaseElement getValue() { 40 | return value; 41 | } 42 | 43 | public BaseElement getObject() { 44 | return object; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/instruction/parseresult/PutStaticParseResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.instruction.parseresult; 2 | 3 | import com.adrninistrator.javacg2.dto.element.BaseElement; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2023/8/3 8 | * @description: PUTSTATIC指令解析结果 9 | */ 10 | public class PutStaticParseResult extends BaseInstructionParseResult { 11 | 12 | // 类名 13 | private final String className; 14 | 15 | // 字段名称 16 | private final String fieldName; 17 | 18 | // 字段类型 19 | private final String fieldType; 20 | 21 | // 对应的值 22 | private final BaseElement value; 23 | 24 | public PutStaticParseResult(String className, String fieldName, String fieldType, BaseElement value) { 25 | this.className = className; 26 | this.fieldName = fieldName; 27 | this.fieldType = fieldType; 28 | this.value = value; 29 | } 30 | 31 | public String getClassName() { 32 | return className; 33 | } 34 | 35 | public String getFieldName() { 36 | return fieldName; 37 | } 38 | 39 | public String getFieldType() { 40 | return fieldType; 41 | } 42 | 43 | public BaseElement getValue() { 44 | return value; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInJarCFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInJarCFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_CLASS_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并jar文件中的class文件判断class文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并jar文件中的class文件时,判断class文件相对路径(相对根目录,或WEB-INF/classes、BOOT-INF/classes目录)是否以指定关键字开头,忽略匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_JAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreClassInWarCFPIJW.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreClassInWarCFPIJW extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_CLASS_IN_JAR_WAR; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_CLASS_FILE_PATH_IN_JAR_WAR.getVariableName() + ", 'test/')"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "合并war文件中的class文件判断class文件相对路径"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在合并war文件中的class文件时,判断class文件相对路径(相对根目录,或WEB-INF/classes、BOOT-INF/classes目录)是否以指定关键字开头,仅处理匹配的文件"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(JAR_OUTPUT_WAR); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/el/checker/JavaCG2ElChecker4MergeFileInDir.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.el.checker; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 4 | import com.adrninistrator.javacg2.el.manager.JavaCG2ElManager; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2025/2/13 9 | * @description: 10 | */ 11 | public class JavaCG2ElChecker4MergeFileInDir extends JavaCG2ElChecker { 12 | 13 | @Override 14 | protected void javaCG2DoCheck(JavaCG2ElManager elManager, JavaCG2ElConfigEnum elConfig) { 15 | switch(elConfig){ 16 | case ECE_MERGE_FILE_IGNORE_JAR_IN_DIR: 17 | elManager.checkIgnoreMergeFileInDir("/a/b.jar"); 18 | break; 19 | case ECE_MERGE_FILE_IGNORE_WAR_IN_DIR: 20 | elManager.checkIgnoreMergeFileInDir("/a/b.war"); 21 | break; 22 | case ECE_MERGE_FILE_IGNORE_CLASS_IN_DIR: 23 | elManager.checkIgnoreMergeFileInDir("/a/b.class"); 24 | break; 25 | case ECE_MERGE_FILE_IGNORE_OTHER_IN_DIR: 26 | elManager.checkIgnoreMergeFileInDir("/a/b.xml"); 27 | break; 28 | default: 29 | break; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcalltypevalue/TestElParseIgnoreMethodCallTypeValueErFullMethod.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcalltypevalue; 2 | 3 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/10 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreMethodCallTypeValueErFullMethod extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL_TYPE_VALUE_CALLER; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return CommonElAllowedVariableEnum.EAVE_MC_ER_FULL_METHOD.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation:test1()'"; 22 | } 23 | 24 | @Override 25 | protected String chooseTitle() { 26 | return "方法调用类型与值判断调用完整方法"; 27 | } 28 | 29 | @Override 30 | protected String chooseDesc() { 31 | return "在解析方法调用被调用对象和参数可能的类型与值时,判断调用完整方法是否等于指定关键字,仅处理匹配的调用方法"; 32 | } 33 | 34 | @Test 35 | public void test() { 36 | run(null); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstructionLookupSwitch.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2025/3/20 8 | * @description: 方法代码指令,lookupswitch 9 | */ 10 | public class MethodCodeInstructionLookupSwitch extends MethodCodeInstruction { 11 | 12 | // 默认跳转目标指令偏移量 13 | private int defaultTargetOffset; 14 | 15 | // 键值对数量 16 | private int pairsNum; 17 | 18 | // 跳转目标列表 19 | private List jumpList; 20 | 21 | public int getDefaultTargetOffset() { 22 | return defaultTargetOffset; 23 | } 24 | 25 | public void setDefaultTargetOffset(int defaultTargetOffset) { 26 | this.defaultTargetOffset = defaultTargetOffset; 27 | } 28 | 29 | public int getPairsNum() { 30 | return pairsNum; 31 | } 32 | 33 | public void setPairsNum(int pairsNum) { 34 | this.pairsNum = pairsNum; 35 | } 36 | 37 | public List getJumpList() { 38 | return jumpList; 39 | } 40 | 41 | public void setJumpList(List jumpList) { 42 | this.jumpList = jumpList; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/methodcall/TestElParseIgnoreMethodCallMethodCallType.java: -------------------------------------------------------------------------------- 1 | package test.el.methodcall; 2 | 3 | import com.adrninistrator.javacg2.common.enums.JavaCG2CallTypeEnum; 4 | import com.adrninistrator.javacg2.el.enums.CommonElAllowedVariableEnum; 5 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 6 | import org.junit.Test; 7 | import test.base.TestElBase; 8 | 9 | /** 10 | * @author adrninistrator 11 | * @date 2025/9/24 12 | * @description: 13 | */ 14 | public class TestElParseIgnoreMethodCallMethodCallType extends TestElBase { 15 | @Override 16 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 17 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL; 18 | } 19 | 20 | @Override 21 | protected String chooseElText() { 22 | return CommonElAllowedVariableEnum.EAVE_METHOD_CALL_TYPE.getVariableName() + " != '" + JavaCG2CallTypeEnum.CTE_SPRING_BEAN_ACTUAL_CLASS.getType() + "'"; 23 | } 24 | 25 | @Override 26 | protected String chooseTitle() { 27 | return "方法调用判断调用类型"; 28 | } 29 | 30 | @Override 31 | protected String chooseDesc() { 32 | return "在解析方法调用时,判断调用类型是否等于指定关键字,仅处理匹配的方法调用"; 33 | } 34 | 35 | @Test 36 | public void test() { 37 | run(null); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEquals.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/4 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEquals extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + " != 'test.callgraph.annotation.CallMethodWithAnnotation'"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断等于关键字"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否等于指定关键字,仅处理匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/field/ClassFieldMethodCall.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.field; 2 | 3 | import com.adrninistrator.javacg2.util.JavaCG2ClassMethodUtil; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2025/2/19 8 | * @description: 对类中字段的方法调用 9 | */ 10 | public class ClassFieldMethodCall extends ClassField { 11 | 12 | // 被调用的方法名 13 | private String methodName; 14 | 15 | // 被调用的方法参数类型 16 | private String[] argTypes; 17 | 18 | // 被调用的方法返回类型 19 | private String returnType; 20 | 21 | public String genFullMethod() { 22 | return JavaCG2ClassMethodUtil.formatFullMethodStr(getClassName(), methodName, argTypes); 23 | } 24 | 25 | // 26 | public String getMethodName() { 27 | return methodName; 28 | } 29 | 30 | public void setMethodName(String methodName) { 31 | this.methodName = methodName; 32 | } 33 | 34 | public String[] getArgTypes() { 35 | return argTypes; 36 | } 37 | 38 | public void setArgTypes(String[] argTypes) { 39 | this.argTypes = argTypes; 40 | } 41 | 42 | public String getReturnType() { 43 | return returnType; 44 | } 45 | 46 | public void setReturnType(String returnType) { 47 | this.returnType = returnType; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameContains.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/2 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameContains extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.contains(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断包含关键字"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否包含指定关键字,忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEndsWith.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/2 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEndsWith extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断以关键字结尾"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否以指定关键字结尾,忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameStartsWith.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameStartsWith extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断以关键字开头"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否以指定关键字开头,忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/thread/ThreadFactory4TPE.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.thread; 2 | 3 | import java.util.concurrent.ThreadFactory; 4 | import java.util.concurrent.atomic.AtomicInteger; 5 | 6 | /** 7 | * @author adrninistrator 8 | * @date 2021/6/21 9 | * @description: 10 | */ 11 | 12 | public class ThreadFactory4TPE implements ThreadFactory { 13 | 14 | private static final AtomicInteger ai = new AtomicInteger(0); 15 | 16 | private final JavaCG2UncaughtExceptionHandler javaCG2UncaughtExceptionHandler = new JavaCG2UncaughtExceptionHandler(); 17 | 18 | private final String threadNamePrefix; 19 | private final boolean daemon; 20 | 21 | public ThreadFactory4TPE(String threadNamePrefix, boolean daemon) { 22 | this.threadNamePrefix = threadNamePrefix; 23 | this.daemon = daemon; 24 | } 25 | 26 | @Override 27 | public Thread newThread(Runnable r) { 28 | Thread thread = new Thread(r); 29 | thread.setName(threadNamePrefix + "-" + ai.addAndGet(1)); 30 | thread.setUncaughtExceptionHandler(javaCG2UncaughtExceptionHandler); 31 | thread.setDaemon(daemon); 32 | 33 | return thread; 34 | } 35 | 36 | public int getExceptionCount() { 37 | return javaCG2UncaughtExceptionHandler.getExceptionCount(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEqualsIC.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEqualsIC extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.equalsIC(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断等于关键字(忽略大小写)"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否等于指定关键字(忽略大小写),忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameContainsIC.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameContainsIC extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.containsIC(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断包含关键字(忽略大小写)"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否包含指定关键字(忽略大小写),忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/writer/WriterSupportSkip.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.writer; 2 | 3 | import com.adrninistrator.javacg2.util.JavaCG2FileUtil; 4 | 5 | import java.io.Closeable; 6 | import java.io.IOException; 7 | import java.io.Writer; 8 | 9 | /** 10 | * @author adrninistrator 11 | * @date 2023/4/26 12 | * @description: 包装后的Writer,若未写文件则不创建文件 13 | */ 14 | public class WriterSupportSkip implements Closeable { 15 | 16 | private final String filePath; 17 | private final boolean buffered; 18 | 19 | private Writer writer; 20 | 21 | public WriterSupportSkip(String filePath) { 22 | this(filePath, true); 23 | } 24 | 25 | public WriterSupportSkip(String filePath, boolean buffered) { 26 | this.filePath = filePath; 27 | this.buffered = buffered; 28 | } 29 | 30 | @Override 31 | public void close() throws IOException { 32 | if (writer != null) { 33 | writer.close(); 34 | } 35 | } 36 | 37 | public void write(String data) throws IOException { 38 | if (writer == null) { 39 | writer = JavaCG2FileUtil.genBufferedWriter(filePath); 40 | } 41 | writer.write(data); 42 | if (!buffered) { 43 | // 不缓存时,每次写文件后flush 44 | writer.flush(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEndsWithIC.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEndsWithIC extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.endsWithIC(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断以关键字结尾(忽略大小写)"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否以指定关键字结尾(忽略大小写),忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/field/FieldTypeAndName.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.field; 2 | 3 | import java.util.Objects; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2022/11/3 8 | * @description: 字段类型及名称 9 | */ 10 | public class FieldTypeAndName { 11 | 12 | // 字段类型 13 | protected final String fieldType; 14 | 15 | // 字段名称 16 | protected final String fieldName; 17 | 18 | public FieldTypeAndName(String fieldType, String fieldName) { 19 | this.fieldType = fieldType; 20 | this.fieldName = fieldName; 21 | } 22 | 23 | @Override 24 | public boolean equals(Object o) { 25 | if (this == o) return true; 26 | if (o == null || getClass() != o.getClass()) return false; 27 | FieldTypeAndName that = (FieldTypeAndName) o; 28 | return fieldName.equals(that.fieldName); 29 | } 30 | 31 | @Override 32 | public int hashCode() { 33 | return Objects.hash(fieldName); 34 | } 35 | 36 | @Override 37 | public String toString() { 38 | return "fieldType=" + fieldType + 39 | ", fieldName=" + fieldName; 40 | } 41 | 42 | // 43 | public String getFieldType() { 44 | return fieldType; 45 | } 46 | 47 | public String getFieldName() { 48 | return fieldName; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/variabledatasource/VariableDataSourceMethodArg.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.variabledatasource; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/6/12 6 | * @description: 变量的数据来源,使用方法参数 7 | */ 8 | public class VariableDataSourceMethodArg extends AbstractVariableDataSource { 9 | 10 | // 参数的序号(从1开始) 11 | private final int argSeq; 12 | 13 | // 参数的类型 14 | private final String argType; 15 | 16 | public VariableDataSourceMethodArg(int argSeq, String argType) { 17 | this.argSeq = argSeq; 18 | this.argType = argType; 19 | } 20 | 21 | /** 22 | * 比较与另一个对象是否相同 23 | * 24 | * @param added 25 | * @return false: 不相同 true: 相同 26 | */ 27 | public boolean compare(VariableDataSourceMethodArg added) { 28 | return this.argSeq == added.argSeq && 29 | this.argType.equals(added.argType); 30 | } 31 | 32 | public int getArgSeq() { 33 | return argSeq; 34 | } 35 | 36 | public String getArgType() { 37 | return argType; 38 | } 39 | 40 | @Override 41 | public String toString() { 42 | return "VariableDataSourceMethodArg{" + 43 | "argSeq=" + argSeq + 44 | ", argType='" + argType + '\'' + 45 | '}'; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameStartsWithIC.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameStartsWithIC extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.startsWithIC(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation')"; 27 | } 28 | 29 | @Override 30 | protected String chooseTitle() { 31 | return "判断以关键字开头(忽略大小写)"; 32 | } 33 | 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,判断类名是否以指定关键字开头(忽略大小写),忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/spring/SpringBeanInXml.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.spring; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/6/18 6 | * @description: XML文件中定义的Spring Bean信息 7 | */ 8 | public class SpringBeanInXml { 9 | 10 | // Spring Bean名称 11 | private String springBeanName; 12 | 13 | // Spring Bean类名 14 | private String className; 15 | 16 | // Spring Bean profile 17 | private String profile; 18 | 19 | // XML文件路径 20 | private String xmlFilePath; 21 | 22 | public String getSpringBeanName() { 23 | return springBeanName; 24 | } 25 | 26 | public void setSpringBeanName(String springBeanName) { 27 | this.springBeanName = springBeanName; 28 | } 29 | 30 | public String getClassName() { 31 | return className; 32 | } 33 | 34 | public void setClassName(String className) { 35 | this.className = className; 36 | } 37 | 38 | public String getProfile() { 39 | return profile; 40 | } 41 | 42 | public void setProfile(String profile) { 43 | this.profile = profile; 44 | } 45 | 46 | public String getXmlFilePath() { 47 | return xmlFilePath; 48 | } 49 | 50 | public void setXmlFilePath(String xmlFilePath) { 51 | this.xmlFilePath = xmlFilePath; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/jar/MergeJarResult.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.jar; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2025/7/6 8 | * @description: 合并jar文件的结果 9 | */ 10 | public class MergeJarResult { 11 | 12 | // 合并后的jar文件 13 | private File mergeJarFile; 14 | 15 | // 合并生成的fat jar文件 16 | private File fatJarFile; 17 | 18 | public static MergeJarResult genOne(File mergeJarFile) { 19 | MergeJarResult mergeJarResult = new MergeJarResult(); 20 | mergeJarResult.setMergeJarFile(mergeJarFile); 21 | return mergeJarResult; 22 | } 23 | 24 | public static MergeJarResult genTwo(File mergeJarFile, File fatJarFile) { 25 | MergeJarResult mergeJarResult = new MergeJarResult(); 26 | mergeJarResult.setMergeJarFile(mergeJarFile); 27 | mergeJarResult.setFatJarFile(fatJarFile); 28 | return mergeJarResult; 29 | } 30 | 31 | public File getMergeJarFile() { 32 | return mergeJarFile; 33 | } 34 | 35 | public void setMergeJarFile(File mergeJarFile) { 36 | this.mergeJarFile = mergeJarFile; 37 | } 38 | 39 | public File getFatJarFile() { 40 | return fatJarFile; 41 | } 42 | 43 | public void setFatJarFile(File fatJarFile) { 44 | this.fatJarFile = fatJarFile; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEqualsAny.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEqualsAny extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.equalsAny(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation'" + 27 | ", 'test.callgraph.annotation.MethodWithAnnotation')"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断等于多个关键字之一"; 33 | } 34 | 35 | @Override 36 | protected String chooseDesc() { 37 | return "在解析类时,判断类名是否等于指定多个关键字之一,忽略匹配的类"; 38 | } 39 | 40 | @Test 41 | public void test() { 42 | run(null); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameContainsAny.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/2 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameContainsAny extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.containsAny(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation'" + 27 | ", 'test.callgraph.annotation.MethodWithAnnotation')"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断包含多个关键字之一"; 33 | } 34 | 35 | @Override 36 | protected String chooseDesc() { 37 | return "在解析类时,判断类名是否包含指定多个关键字之一,忽略匹配的类"; 38 | } 39 | 40 | @Test 41 | public void test() { 42 | run(null); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameEndsWithAny.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/2 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameEndsWithAny extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.endsWithAny(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation'" + 27 | ", 'test.callgraph.annotation.MethodWithAnnotation')"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断以多个关键字之一结尾"; 33 | } 34 | 35 | @Override 36 | protected String chooseDesc() { 37 | return "在解析类时,判断类名是否以指定多个关键字之一结尾,忽略匹配的类"; 38 | } 39 | 40 | @Test 41 | public void test() { 42 | run(null); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameStartsWithAny.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameStartsWithAny extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.startsWithAny(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.CallMethodWithAnnotation'" + 27 | ", 'test.callgraph.annotation.MethodWithAnnotation')"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断以多个关键字之一开头"; 33 | } 34 | 35 | @Override 36 | protected String chooseDesc() { 37 | return "在解析类时,判断类名是否以指定多个关键字之一开头,忽略匹配的类"; 38 | } 39 | 40 | @Test 41 | public void test() { 42 | run(null); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/test/java/test/el/mergefile/TestElMergeFileIgnoreJarByClassDirPrefix.java: -------------------------------------------------------------------------------- 1 | package test.el.mergefile; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/9/24 11 | * @description: 12 | */ 13 | public class TestElMergeFileIgnoreJarByClassDirPrefix extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_MERGE_FILE_IGNORE_JAR_WAR_BY_CLASS_DIR_PREFIX; 17 | } 18 | 19 | @Override 20 | protected String chooseElText() { 21 | return "!include(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_CLASS_DIR_PREFIX_LEVEL.getVariableName() + "2, 'com/adrninistrator') && " 22 | + "!include(" + JavaCG2ElAllowedVariableEnum.EAVE_MF_CLASS_DIR_PREFIX_LEVEL.getVariableName() + "3, 'org/apache/bcel')"; 23 | } 24 | 25 | @Override 26 | protected String chooseTitle() { 27 | return "合并jar文件判断所有class文件所在指定层级的目录路径"; 28 | } 29 | 30 | @Override 31 | protected String chooseDesc() { 32 | return "在合并jar文件时,判断所有class文件所在指定层级的目录路径是否包括指定的路径,仅处理class文件所在指定层级的目录路径包括特定路径的jar文件"; 33 | } 34 | 35 | @Test 36 | public void test() { 37 | run(JAR_OUTPUT_DIR); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/test/resources/log4j2_file.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/exception/FinallyInfo.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.exception; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2023/12/28 6 | * @description: Exception table中的finally信息 7 | */ 8 | public class FinallyInfo { 9 | protected final int fromPosition; 10 | protected final int toPosition; 11 | protected final int endPosition; 12 | protected final int targetPosition; 13 | 14 | public FinallyInfo(int fromPosition, int toPosition, int endPosition, int targetPosition) { 15 | this.fromPosition = fromPosition; 16 | this.toPosition = toPosition; 17 | this.endPosition = endPosition; 18 | this.targetPosition = targetPosition; 19 | } 20 | 21 | public int getFromPosition() { 22 | return fromPosition; 23 | } 24 | 25 | public int getToPosition() { 26 | return toPosition; 27 | } 28 | 29 | public int getEndPosition() { 30 | return endPosition; 31 | } 32 | 33 | public int getTargetPosition() { 34 | return targetPosition; 35 | } 36 | 37 | @Override 38 | public String toString() { 39 | return "FinallyInfo{" + 40 | "fromPosition=" + fromPosition + 41 | ", toPosition=" + toPosition + 42 | ", endPosition=" + endPosition + 43 | ", targetPosition=" + targetPosition + 44 | '}'; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameAnd.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/2 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameAnd extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return "string.startsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'test.callgraph.annotation.') && " + 27 | "string.endsWith(" + JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + ", 'CallMethodWithAnnotation')"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断多个条件使用与"; 33 | } 34 | @Override 35 | protected String chooseDesc() { 36 | return "在解析类时,多个条件使用与运算,判断类名是否以指定关键字开头,且以指定关键字结尾,忽略匹配的类"; 37 | } 38 | 39 | @Test 40 | public void test() { 41 | run(null); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/test/el/stringcompare/TestElParseIgnoreClassClassNameOr.java: -------------------------------------------------------------------------------- 1 | package test.el.stringcompare; 2 | 3 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElAllowedVariableEnum; 4 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 5 | import org.junit.Test; 6 | import test.base.TestElBase; 7 | 8 | /** 9 | * @author adrninistrator 10 | * @date 2025/10/3 11 | * @description: 12 | */ 13 | public class TestElParseIgnoreClassClassNameOr extends TestElBase { 14 | @Override 15 | protected JavaCG2ElConfigEnum chooseElConfigEnum() { 16 | return JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_CLASS; 17 | } 18 | 19 | @Override 20 | protected boolean example4StringCompare() { 21 | return true; 22 | } 23 | 24 | @Override 25 | protected String chooseElText() { 26 | return JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + " == 'test.callgraph.annotation.CallMethodWithAnnotation' || " + 27 | JavaCG2ElAllowedVariableEnum.EAVE_PARSE_CLASS_NAME.getVariableName() + " == 'test.callgraph.annotation.MethodWithAnnotation'"; 28 | } 29 | 30 | @Override 31 | protected String chooseTitle() { 32 | return "判断多个条件使用或"; 33 | } 34 | 35 | @Override 36 | protected String chooseDesc() { 37 | return "在解析类时,多个条件使用或运算,判断类名是否等于指定多个关键字中的任意一个,忽略匹配的类"; 38 | } 39 | 40 | @Test 41 | public void test() { 42 | run(null); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/methodcode/MethodCodeInstructionTableSwitch.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.methodcode; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author adrninistrator 7 | * @date 2025/3/21 8 | * @description: 方法代码指令,tableswitch 9 | */ 10 | public class MethodCodeInstructionTableSwitch extends MethodCodeInstruction { 11 | 12 | // 默认跳转目标指令偏移量 13 | private int defaultTargetOffset; 14 | 15 | // case最小值 16 | private int low; 17 | 18 | // case最大值 19 | private int high; 20 | 21 | // 跳转目标列表 22 | private List jumpTargetOffsetList; 23 | 24 | public int getDefaultTargetOffset() { 25 | return defaultTargetOffset; 26 | } 27 | 28 | public void setDefaultTargetOffset(int defaultTargetOffset) { 29 | this.defaultTargetOffset = defaultTargetOffset; 30 | } 31 | 32 | public int getLow() { 33 | return low; 34 | } 35 | 36 | public void setLow(int low) { 37 | this.low = low; 38 | } 39 | 40 | public int getHigh() { 41 | return high; 42 | } 43 | 44 | public void setHigh(int high) { 45 | this.high = high; 46 | } 47 | 48 | public List getJumpTargetOffsetList() { 49 | return jumpTargetOffsetList; 50 | } 51 | 52 | public void setJumpTargetOffsetList(List jumpTargetOffsetList) { 53 | this.jumpTargetOffsetList = jumpTargetOffsetList; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/dto/field/ClassFieldTypeAndName.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.dto.field; 2 | 3 | import com.adrninistrator.javacg2.util.JavaCG2ClassMethodUtil; 4 | 5 | import java.util.Objects; 6 | 7 | /** 8 | * @author adrninistrator 9 | * @date 2024/2/2 10 | * @description: 类中的字段类型及名称,包括静态字段及非静态字段 11 | */ 12 | public class ClassFieldTypeAndName extends FieldTypeAndName { 13 | 14 | // 类名 15 | private final String className; 16 | 17 | public ClassFieldTypeAndName(String fieldType, String fieldName, String className) { 18 | super(fieldType, fieldName); 19 | this.className = className; 20 | } 21 | 22 | /** 23 | * 获取类名+字段名 24 | * 25 | * @return 类名:字段名 26 | */ 27 | public String getClassAndFieldName() { 28 | return JavaCG2ClassMethodUtil.formatClassAndField(className, fieldName); 29 | } 30 | 31 | @Override 32 | public boolean equals(Object o) { 33 | if (this == o) return true; 34 | if (o == null || getClass() != o.getClass()) return false; 35 | if (!super.equals(o)) return false; 36 | ClassFieldTypeAndName that = (ClassFieldTypeAndName) o; 37 | return fieldName.equals(that.fieldName) && className.equals(that.className); 38 | } 39 | 40 | @Override 41 | public int hashCode() { 42 | return Objects.hash(fieldName, className); 43 | } 44 | 45 | public String getClassName() { 46 | return className; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/test/java/test/config/TestConfigUsage.java: -------------------------------------------------------------------------------- 1 | package test.config; 2 | 3 | import com.adrninistrator.javacg2.conf.JavaCG2ConfigureWrapper; 4 | import com.adrninistrator.javacg2.conf.enums.JavaCG2ConfigKeyEnum; 5 | import com.adrninistrator.javacg2.conf.enums.JavaCG2OtherConfigFileUseListEnum; 6 | import com.adrninistrator.javacg2.conf.enums.JavaCG2OtherConfigFileUseSetEnum; 7 | import com.adrninistrator.javacg2.conf.enums.interfaces.ConfigInterface; 8 | import com.adrninistrator.javacg2.el.enums.JavaCG2ElConfigEnum; 9 | import org.junit.Test; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | 13 | /** 14 | * @author adrninistrator 15 | * @date 2025/6/2 16 | * @description: 17 | */ 18 | public class TestConfigUsage { 19 | 20 | private static final Logger logger = LoggerFactory.getLogger(TestConfigUsage.class); 21 | 22 | private final JavaCG2ConfigureWrapper javaCG2ConfigureWrapper = new JavaCG2ConfigureWrapper(); 23 | 24 | @Test 25 | public void test() { 26 | doTest(JavaCG2ElConfigEnum.values()); 27 | doTest(JavaCG2ConfigKeyEnum.values()); 28 | doTest(JavaCG2OtherConfigFileUseListEnum.values()); 29 | doTest(JavaCG2OtherConfigFileUseSetEnum.values()); 30 | } 31 | 32 | private void doTest(ConfigInterface[] configInterfaces) { 33 | for (ConfigInterface configInterface : configInterfaces) { 34 | String usage = configInterface.genConfigUsage(); 35 | logger.info("### {}", usage); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/adrninistrator/javacg2/common/enums/JavaCG2DirEnum.java: -------------------------------------------------------------------------------- 1 | package com.adrninistrator.javacg2.common.enums; 2 | 3 | /** 4 | * @author adrninistrator 5 | * @date 2025/1/30 6 | * @description: 7 | */ 8 | public enum JavaCG2DirEnum { 9 | 10 | IDE_CONFIG("_javacg2_config", "java-callgraph2组件主要配置文件所在目录", true), 11 | IDE_MERGE_FILE_SWITCH("_javacg2_merge_file_switch", "合并jar/war文件、目录相关开关配置文件目录", true), 12 | IDE_PARSE_CLASS_METHOD_SWITCH("_javacg2_parse_class_method_switch", "解析类、方法相关开关配置文件所在目录", true), 13 | IDE_PARSE_METHOD_CALL_SWITCH("_javacg2_parse_method_call_switch", "解析方法调用相关开关配置文件所在目录", true), 14 | IDE_HANDLE_XML_SWITCH("_javacg2_handle_xml_switch", "处理XML文件开关配置文件所在目录", true), 15 | IDE_EL_EXAMPLE("_el_example", "el表达式示例配置文件所在目录", true), 16 | IDE_FAIL_CLASSES("javacg2_fail_classes", "el表达式配置说明文件所在目录", false), 17 | ; 18 | 19 | private final String dirName; 20 | private final String description; 21 | private final boolean input; 22 | 23 | JavaCG2DirEnum(String dirName, String description, boolean input) { 24 | this.dirName = dirName; 25 | this.description = description; 26 | this.input = input; 27 | } 28 | 29 | public String getDirName() { 30 | return dirName; 31 | } 32 | 33 | public String getDescription() { 34 | return description; 35 | } 36 | 37 | public boolean isInput() { 38 | return input; 39 | } 40 | 41 | @Override 42 | public String toString() { 43 | return dirName; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/resources/_javacg2_parse_method_call_switch/parse_ignore_method_call.av: -------------------------------------------------------------------------------- 1 | ## 对应的枚举类名: JavaCG2ElConfigEnum.ECE_PARSE_IGNORE_METHOD_CALL 2 | ## (作用)在 解析方法调用时 使用的表达式 3 | ## (作用)若当前配置文件中的表达式执行结果为 true,则跳过解析对应的方法调用 4 | ## (作用)若表达式执行结果为 false,或未指定表达式,则当前配置不会跳过对应的方法调用 5 | ## (范围)指定是否跳过解析方法调用,支持通过方法调用类型、调用方法或被调用方法等判断 6 | ## (表达式使用通用说明文档)请参考 _el_example/el_usage.md 7 | ## (表达式字符串比较说明文档)请参考 _el_example/string_compare.md 8 | ## (当前表达式使用示例文档)请参考 _el_example/_javacg2_parse_method_call_switch/parse_ignore_method_call.av.md 9 | ## (允许使用的变量){变量名称} {变量类型} {变量描述} {变量值示例} 10 | ## {method_call_type} {String} {方法调用类型, 参考 JavaCG2CallTypeEnum 类} {VIR INT SPE STA DYN _SPR_ACT_I _SPR_ACT_C _ACT_I _ACT_C _ITF _BSM _LM _RIR1 _RIR2 _CIC1 _CIC2 _TCID1 _TCID2 _TCWRID1 _TCWRID2 _TSR _SCC _CCS _CCS_SPE _CCS_I _CCID _ICID _MA _MAA ILLEGAL} 11 | ## {er_class_name} {String} {调用方完整类名} {a.b.Class1} 12 | ## {er_package_name} {String} {调用方完整包名, 不会以.结束} {a.b} 13 | ## {er_simple_class_name} {String} {调用方简单类名} {Class1} 14 | ## {er_method_name} {String} {调用方方法名, 不包括括号及方法参数} {method1} 15 | ## {er_method_arg_num} {int} {调用方方法参数数量} {0, 1} 16 | ## {er_full_method} {String} {调用方完整方法, 包括括号及方法参数} {a.b.Class1:method1(int)} 17 | ## {ee_class_name} {String} {被调用方完整类名} {a.b.Class1} 18 | ## {ee_package_name} {String} {被调用方完整包名, 不会以.结束} {a.b} 19 | ## {ee_simple_class_name} {String} {被调用方简单类名} {Class1} 20 | ## {ee_method_name} {String} {被调用方方法名, 不包括括号及方法参数} {method1} 21 | ## {ee_method_arg_num} {int} {被调用方方法参数数量} {0, 1} 22 | ## {ee_full_method} {String} {被调用方完整方法, 包括括号及方法参数} {a.b.Class1:method1(int)} 23 | --------------------------------------------------------------------------------