我是新手的反思.有什么办法可以检测调用特定方法的位置吗?例如:
public class MyClass { public static void method(){ //DO SOMETHING } } public class Test { public test(){ MyClass.method(); } } public class MyProcessor extends AbstractProcessor { public boolean process(Set<? extends TypeElement> annotations,RoundEnvironment roundEnv) { Method method = MyClass.class.getDeclaredMethod("method"); Class classWhereMethodIsInvoked = obtainClassWhereMethodIsInvoked(method); } public Class obtainClassWhereMethodIsInvoked(Method method) { //here I want to search one class that invoke that method,in this case Test.class } }
是这样可能的,还是我疯了?
解决方法
是的,如果你真的想要它是可行的您可以使用classLoader来搜索类路径,并通过所有类文件扫描方法名称.下面是一个非常简单的例子来说明它是可行的.在下面的例子中,我发现在这个类中使用了“println”方法.从本质上讲,您可以将示例中的一个文件的范围扩展到所有类文件.
public class SearchClasses { /** * @param args the command line arguments */ public static void main(String[] args) throws FileNotFoundException { // InputStream is = SearchClasses.class.getClassLoader().getResourceAsStream("resources.SearchClasses.class"); InputStream is = new FileInputStream(new File("build/classes/resources/SearchClasses.class")); boolean found = false; Scanner scanner = new Scanner(is); while (scanner.hasNext()) { if (scanner.nextLine().contains("println")) { System.out.print("println found"); found = true; break; } } if (!found) { System.out.print("println NOT found"); } } public static void testMethod() { System.out.println("testing"); } }
在我的IDE中,我不得不使用FileInputStream访问我正在搜索的类文件.但是如果您正在搜索jar文件,那么可以使用classLoader.您需要机制来搜索所有的类路径…这不是不可能的,但我为了简洁而留下来.
编辑:这是试图让它完全正常工作..搜索类路径中的所有文件为您的方法.
public class SearchClasses { /** * @param args the command line arguments * @throws java.io.FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException,IOException { printAllFileWithMethod("println"); } public static void printAllFileWithMethod(String methodName) throws FileNotFoundException,IOException { Enumeration<URL> roots = SearchClasses.class.getClassLoader().getResources(""); List<File> allClassFiles = new ArrayList<>(); while (roots.hasMoreElements()) { File root = new File(roots.nextElement().getPath()); allClassFiles.addAll(getFilesInDirectoryWithSuffix(root,"class")); } for (File classFile : allClassFiles) { InputStream is = new FileInputStream(classFile); boolean found = false; Scanner scanner = new Scanner(is); while (scanner.hasNext()) { if (scanner.nextLine().contains(methodName)) { System.out.print(methodName + " found in " + classFile.getName() + "\n"); found = true; break; } } } } public static void testMethod() { System.out.println("testing"); } static List<File> getFilesInDirectoryWithSuffix(File dir,String suffix) { List<File> foundFiles = new ArrayList<>(); if (!dir.isDirectory()) { return foundFiles; } for (File file : dir.listFiles()) { if (file.isDirectory()) { foundFiles.addAll(getFilesInDirectoryWithSuffix(file,suffix)); } else { String name = file.getName(); if (name.endsWith(suffix)) { foundFiles.add(file); } } } return foundFiles; } }