Просмотр исходного кода

1.增加加密参数keepArgName:是否保留原始的方法参数名
2.javassist版本升级
3.JavassistUtil代码格式整理

JustryDeng 1 год назад
Родитель
Сommit
5801f3bb09

+ 1 - 1
README.md

@@ -651,7 +651,7 @@ linux示例:tips='请不要直接使用混淆后的jar/war'</td>
 
   - **如果配置时使用的前缀匹配:** 首先检查指定的前缀是否包含住了指定了lib名,然后检查includePrefix匹配范围是否包含lib中的class
 
-  - **如果配置时使用的模糊匹配:**首先检查正则语法是否配置正确(见:FAQ-8),然后检查includePrefix匹配范围是否包含lib中的class
+  - **如果配置时使用的模糊匹配:** 首先检查正则语法是否配置正确(见:FAQ-8),然后检查includePrefix匹配范围是否包含lib中的class
 
 - **8. 模糊匹配,正则未生效?**
 

+ 1 - 1
class-winter-core/pom.xml

@@ -16,7 +16,7 @@
         <dependency>
             <groupId>org.javassist</groupId>
             <artifactId>javassist</artifactId>
-            <version>3.27.0-GA</version>
+            <version>3.30.2-GA</version>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->

+ 2 - 1
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/executor/EncryptExecutor.java

@@ -1001,7 +1001,8 @@ public class EncryptExecutor {
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME), false),
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME), false),
                                         StrUtil.isTrueDefault(params.get(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME), false),
-                                        params.get(Constant.TO_CLEAN_FIELD_ANNOTATION_PREFIX)
+                                        params.get(Constant.TO_CLEAN_FIELD_ANNOTATION_PREFIX),
+                                        StrUtil.isTrueDefault(params.get(Constant.KEEP_ORIGIN_ARGS_NAME), true)
                                 );
                             }
                         }

+ 7 - 0
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/Constant.java

@@ -263,6 +263,13 @@ public interface Constant {
      */
     String TO_CLEAN_FIELD_ANNOTATION_PREFIX = "caPrefix";
     
+    /**
+     * 参数名:是否保留原始的方法参数名. 值应为boolean类型
+     * <p>
+     * 为false的话,则加密后方法的参数名将依次被重命名为var0、var1、var2...
+     */
+    String KEEP_ORIGIN_ARGS_NAME = "keepArgName";
+    
     /*
      * 部分projectpath识别出来会多一个nested:/前缀
      */

+ 2 - 2
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/EncryptClassArgs.java

@@ -47,7 +47,7 @@ public class EncryptClassArgs {
      */
     public static EncryptClassArgs create(File encryptClassFile, boolean cleanAnnotationOverClazz,
                                           boolean cleanAnnotationOverMethod, boolean cleanAnnotationOverField,
-            String toCleanAnnotationPrefix) {
+                                          String toCleanAnnotationPrefix, boolean keepOriginArgsName) {
         Objects.requireNonNull(encryptClassFile, "encryptClassFile cannot be null.");
         EncryptClassArgs encryptClassArgs = new EncryptClassArgs();
         encryptClassArgs.setEncryptClassFile(encryptClassFile);
@@ -55,7 +55,7 @@ public class EncryptClassArgs {
         encryptClassArgs.setCleanAnnotationOverMethod(cleanAnnotationOverMethod);
         encryptClassArgs.setCleanAnnotationOverField(cleanAnnotationOverField);
         encryptClassArgs.setToCleanAnnotationPrefix(toCleanAnnotationPrefix);
-
+        encryptClassArgs.setKeepOriginArgsName(keepOriginArgsName);
         return encryptClassArgs;
     }
     

+ 25 - 33
class-winter-core/src/main/java/winter/com/ideaaedi/classwinter/util/JavassistUtil.java

@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
  * @since 2021/4/25 20:54:30
  */
 public final class JavassistUtil {
-
+    
     /**
      * 清空类中的方法体,并简单处理一下main,使提示密码无效
      *
@@ -62,7 +62,7 @@ public final class JavassistUtil {
             boolean cleanOverMethod = encryptClassArgs.isCleanAnnotationOverMethod();
             boolean cleanOverField = encryptClassArgs.isCleanAnnotationOverField();
             String toCleanAnnotationPrefix = encryptClassArgs.getToCleanAnnotationPrefix();
-
+            
             if (cleanOverCLass || cleanOverMethod || cleanOverField) {
                 try {
                     clearAnnotation(ctClass, cleanOverCLass, cleanOverMethod, cleanOverField, toCleanAnnotationPrefix);
@@ -117,7 +117,8 @@ public final class JavassistUtil {
      * @param cleanOverMethod 是否清空方法上的注解
      * @param cleanOverField 是否清空字段上的注解
      */
-    private static void clearAnnotation(CtClass ctClass, boolean cleanOverCLass, boolean cleanOverMethod, boolean cleanOverField, String toCleanAnnotationPrefix) {
+    private static void clearAnnotation(CtClass ctClass, boolean cleanOverCLass, boolean cleanOverMethod,
+                                        boolean cleanOverField, String toCleanAnnotationPrefix) {
         // 清空类上的注解
         if (cleanOverCLass) {
             removeAnnotationsAttribute(ctClass.getClassFile().getAttributes(), toCleanAnnotationPrefix);
@@ -142,6 +143,7 @@ public final class JavassistUtil {
      * 移除注解属性
      *
      * @param attributeInfoList 属性信息集合
+     *
      * @return 操作是否成功
      */
     @SuppressWarnings("UnusedReturnValue")
@@ -180,10 +182,8 @@ public final class JavassistUtil {
     /**
      * 加载paths指定的.jar文件(或加载对应子孙目录下的所有jar包)
      *
-     * @param classPool
-     *            javassist的classPool
-     * @param paths
-     *            要加载的文件夹或jar包
+     * @param classPool javassist的classPool
+     * @param paths 要加载的文件夹或jar包
      */
     public static void loadJar(ClassPool classPool, String... paths) throws NotFoundException {
         if (paths == null) {
@@ -197,10 +197,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的.class文件(或加载对应子孙目录下的所有.class文件)
      *
-     * @param classPool
-     *            javassist的classPool
-     * @param paths
-     *            要加载的文件夹或.class文件
+     * @param classPool javassist的classPool
+     * @param paths 要加载的文件夹或.class文件
      */
     public static void loadClass(ClassPool classPool, String... paths) throws NotFoundException {
         if (paths == null) {
@@ -228,8 +226,8 @@ public final class JavassistUtil {
     /**
      * 清空方法体,并且保留原参数名
      *
-     * @param ctMethod
-     *            javassist的方法对象
+     * @param ctMethod javassist的方法对象
+     *
      * @throws CannotCompileException 编译异常
      * @throws NotFoundException 确实类异常
      */
@@ -285,10 +283,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的jar包(或加载对应子孙目录下的所有jar包)
      *
-     * @param pool
-     *            javassist的ClassPool
-     * @param dirOrFile
-     *            要加载的文件夹或.jar文件
+     * @param pool javassist的ClassPool
+     * @param dirOrFile 要加载的文件夹或.jar文件
      */
     private static void loadJar(ClassPool pool, File dirOrFile) throws NotFoundException {
         if (dirOrFile == null || !dirOrFile.exists()) {
@@ -303,10 +299,8 @@ public final class JavassistUtil {
     /**
      * 加载指定的.class文件(或加载对应子孙目录下的所有.class文件)
      *
-     * @param pool
-     *            javassist的ClassPool
-     * @param dirOrFile
-     *            要加载的文件夹或.class文件
+     * @param pool javassist的ClassPool
+     * @param dirOrFile 要加载的文件夹或.class文件
      */
     private static void loadClasses(ClassPool pool, File dirOrFile) throws NotFoundException {
         if (dirOrFile == null || !dirOrFile.exists()) {
@@ -328,21 +322,19 @@ public final class JavassistUtil {
             pool.insertClassPath(rootDir);
         }
     }
-
+    
     /**
      * 根据class的绝对路径解析出class全类名(或class全类名文件所在的目录路径)
-     * <p>
-     *     假设文件的全路径名是这样的/tmp/class-winter-core/src/main/java/com/niantou/iwork/core/Abc.class,
-     *     那么, 解析出来的class全类名即为com.niantou.iwork.core.Abc
-     *          解析出来的class全类名文件所在的目录路径即为/tmp/class-winter-core/src/main/java
+     * <pre>
+     * 假设文件的全路径名是这样的/tmp/class-winter-core/src/main/java/com/niantou/iwork/core/Abc.class,
+     * 那么, 解析出来的class全类名即为com.niantou.iwork.core.Abc
+     *       解析出来的class全类名文件所在的目录路径即为/tmp/class-winter-core/src/main/java
+     * </pre>
      *
-     * </p>
+     * @param fileName class文件的绝对路径
+     * @param classOrPath true-解析全类名;false-解析全类名文件所在的目录路径
      *
-     * @param fileName
-     *            class文件的绝对路径
-     * @param classOrPath
-     *            true-解析全类名;false-解析全类名文件所在的目录路径
-     * @return  class所代表类的全类名(如com.aaa.bbb.Abc) 或者路径(如: /tmp/class-winter-core/src/main/java)
+     * @return class所代表类的全类名(如com.aaa.bbb.Abc) 或者路径(如: /tmp/class-winter-core/src/main/java)
      */
     public static String resolveClassName(String fileName, boolean classOrPath) {
         // 去除后缀名
@@ -379,5 +371,5 @@ public final class JavassistUtil {
         classPath = nonSuffixFileName.substring(0, nonSuffixFileName.length() - className.length() - 1);
         return classOrPath ? className.replace(File.separator, ".") : classPath;
     }
-
+    
 }

+ 3 - 0
class-winter-core/src/test/java/winter/com/ideaaedi/classwinter/EncryptArgParam_Test.java

@@ -28,6 +28,7 @@ public class EncryptArgParam_Test {
 //        argMap.put(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "true"); // 默认为false
+//        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "false"); // 默认为true
 //        have(argMap);
     
 //        // 测试3: 有参数测试
@@ -35,6 +36,7 @@ public class EncryptArgParam_Test {
 //        argMap.put(Constant.CLEAN_CLASS_ANNOTATION_PARAM_NAME, "false");  // 默认为false
 //        argMap.put(Constant.CLEAN_METHOD_ANNOTATION_PARAM_NAME, "true");  // 默认为false
 //        argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "false"); // 默认为false
+//        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "false"); // 默认为true
 //        have(argMap);
     
         // 测试4: 有参数测试
@@ -44,6 +46,7 @@ public class EncryptArgParam_Test {
         argMap.put(Constant.CLEAN_FIELD_ANNOTATION_PARAM_NAME, "true"); // 默认为false
         // 这里仅作测试实际清除spring boot注解会有问题 ,spring ClassReader读的是本地classfile 所以清除的spring 注解读取不到了
         argMap.put(Constant.TO_CLEAN_FIELD_ANNOTATION_PREFIX, "org.springframework.context.annotation.Configuration"); // 默认为''
+        argMap.put(Constant.KEEP_ORIGIN_ARGS_NAME, "true"); // 默认为true
 
         have(argMap);
     }