diff --git a/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java index 4f2338b..8e30be2 100644 --- a/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java +++ b/testable-processor/src/main/java/com/alibaba/testable/processor/translator/EnablePrivateAccessTranslator.java @@ -4,7 +4,7 @@ import com.alibaba.testable.processor.constant.ConstPool; import com.alibaba.testable.processor.generator.PrivateAccessStatementGenerator; import com.alibaba.testable.processor.model.MemberType; import com.alibaba.testable.processor.model.TestableContext; -import com.alibaba.testable.processor.util.StringUtil; +import com.alibaba.testable.processor.util.PathUtil; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.ListBuffer; @@ -14,6 +14,7 @@ import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; @@ -26,6 +27,8 @@ public class EnablePrivateAccessTranslator extends BaseTranslator { private static final String IDEA_PATHS_SELECTOR = "idea.paths.selector"; private static final String USER_DIR = "user.dir"; + private static final String GRADLE_CLASS_FOLDER = "/build/classes/java/main/"; + private static final String MAVEN_CLASS_FOLDER = "/target/classes/"; /** * Name of source class @@ -56,6 +59,7 @@ public class EnablePrivateAccessTranslator extends BaseTranslator { Class cls = null; String sourceClassFullName = pkgName + "." + sourceClass; try { + // maven build goes here cls = Class.forName(sourceClassFullName); } catch (ClassNotFoundException e) { if (System.getProperty(IDEA_PATHS_SELECTOR) != null) { @@ -64,14 +68,18 @@ public class EnablePrivateAccessTranslator extends BaseTranslator { String sourceFilePath = sourceFileWrapperString.substring( sourceFileWrapperString.lastIndexOf("[") + 1, sourceFileWrapperString.indexOf("]")); int indexOfSrc = sourceFilePath.lastIndexOf(File.separator + "src" + File.separator); - String targetFolderPath = StringUtil.fitPathString(sourceFilePath.substring(0, indexOfSrc) + - "/target/classes/"); - cls = new URLClassLoader(new URL[] {new URL(targetFolderPath)}).loadClass(sourceClassFullName); + String basePath = sourceFilePath.substring(0, indexOfSrc); + String targetFolderPath = PathUtil.fitPathString(basePath + MAVEN_CLASS_FOLDER); + try { + cls = loadClass(targetFolderPath, sourceClassFullName); + } catch (ClassNotFoundException e2) { + targetFolderPath = PathUtil.fitPathString(basePath + GRADLE_CLASS_FOLDER); + cls = loadClass(targetFolderPath, sourceClassFullName); + } } else { // fit for gradle build - String path = StringUtil.fitPathString("file:" - + System.getProperty(USER_DIR) + "/build/classes/java/main/"); - cls = new URLClassLoader(new URL[] {new URL(path)}).loadClass(sourceClassFullName); + String path = PathUtil.fitPathString("file:" + System.getProperty(USER_DIR) + GRADLE_CLASS_FOLDER); + cls = loadClass(path, sourceClassFullName); } } if (cls == null) { @@ -176,6 +184,11 @@ public class EnablePrivateAccessTranslator extends BaseTranslator { return expr; } + private Class loadClass(String targetFolderPath, String sourceClassFullName) + throws ClassNotFoundException, MalformedURLException { + return new URLClassLoader(new URL[] {new URL(targetFolderPath)}).loadClass(sourceClassFullName); + } + private MemberType checkGetterType(JCFieldAccess access) { if (access.selected.getClass().equals(JCIdent.class) && privateOrFinalFields.contains(access.name.toString())) { diff --git a/testable-processor/src/main/java/com/alibaba/testable/processor/util/PathUtil.java b/testable-processor/src/main/java/com/alibaba/testable/processor/util/PathUtil.java new file mode 100644 index 0000000..4b4f743 --- /dev/null +++ b/testable-processor/src/main/java/com/alibaba/testable/processor/util/PathUtil.java @@ -0,0 +1,24 @@ +package com.alibaba.testable.processor.util; + +public class PathUtil { + + private static final String PREFIX_WIN = "win"; + private static final String PROPERTY_OS_NAME = "os.name"; + private static final String PATH_SPLIT_UNIX = "/"; + private static final String PATH_SPLIT_WIN = "\\"; + private static final String PROTOCOL_FILE = "file:/"; + + /** + * Fit path according to operation system type + * @param path original path + * @return fitted path + */ + public static String fitPathString(String path) { + String os = System.getProperty(PROPERTY_OS_NAME); + if (os.toLowerCase().startsWith(PREFIX_WIN)) { + return path.replaceAll(PATH_SPLIT_UNIX, PATH_SPLIT_WIN); + } + return path.startsWith(PROTOCOL_FILE) ? path : (PROTOCOL_FILE + path); + } + +} diff --git a/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java b/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java index 044e039..c73a164 100644 --- a/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java +++ b/testable-processor/src/main/java/com/alibaba/testable/processor/util/StringUtil.java @@ -7,11 +7,6 @@ import java.util.List; */ public class StringUtil { - private static final String PREFIX_WIN = "win"; - private static final String PROPERTY_OS_NAME = "os.name"; - private static final String PATH_SPLIT_UNIX = "/"; - private static final String PATH_SPLIT_WIN = "\\"; - /** * Join strings * @param list strings to join @@ -32,17 +27,4 @@ public class StringUtil { return sb.toString(); } - /** - * Fit path according to operation system type - * @param path original path - * @return fitted path - */ - static public String fitPathString(String path) { - String os = System.getProperty(PROPERTY_OS_NAME); - if (os.toLowerCase().startsWith(PREFIX_WIN)) { - return path.replaceAll(PATH_SPLIT_UNIX, PATH_SPLIT_WIN); - } - return path; - } - }