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