gpt4 book ai didi

Java 8,如何发现访问MethodIn Vocation中的类和方法名?

转载 作者:行者123 更新时间:2023-12-02 07:50:21 25 4
gpt4 key购买 nike

对于 Java7 和 Java8,我希望在调用某些方法时生成警告。如果用户编译时存在特定的 jar,则会打印警告。

我编写了一个注释处理器并捕获了访问方法调用()。现在,我想提取将被调用的类和方法名称。

可以这样做吗?或者如何解决这个问题?

最佳答案

你可以这样做:

package mystuff;

import com.sun.source.tree.*;
import com.sun.source.util.*;
import java.util.*;
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import javax.tools.*;

@SupportedAnnotationTypes("*")
public class Proc extends AbstractProcessor{
@Override
public boolean process(Set<?extends TypeElement>annotations,RoundEnvironment roundEnvironment){
final Trees trees=Trees.instance(processingEnv);
for(Element element:roundEnvironment.getRootElements()){
TreePath path=trees.getPath(element);
final CompilationUnitTree compilationUnit=path.getCompilationUnit();
compilationUnit.accept(new TreeScanner<Object,Object>(){
@Override
public Object visitMethodInvocation(MethodInvocationTree tree,Object data){
tree.getMethodSelect().accept(new SimpleTreeVisitor<Object,Object>(){
@Override
public Object visitMemberSelect(MemberSelectTree tree,Object data){
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,String.format("class: %1$s\nmethod: %2$s",tree.getExpression(),tree.getIdentifier()));
return null;
}
},null);
return null;
}
},null);
}
return true;
}
}

我使用该处理器来处理下面的类

package stuff;

import java.util.*;

@MyAnnotation
class MyProgram{
public void run(){
System.out.println("Hello World!");
}
}

并取得了这样的结果:

class:  System.out
method: println

我很确定生成的方法名称就是您正在寻找的。我很确定“类(class)”并不正是您正在寻找的,但这是一个很好的开始。

在我的示例中,您可能希望它为类打印“java.io.PrintStream”。为此,您可以使用 processingEnv.getElementUtils().getTypeElement("java.lang.System") 来获取表示系统类的 TypeElement。然后,您可以使用processingEnv.getElementUtils().getAllMembers()来获取系统类的每个成员。迭代它以找到out。使用 asType 方法获取其类型。

上一段是一个粗略的简化。处理器事先并不知道 out 是隐式导入 java.lang 包的一部分的类的静态成员。因此,您的代码将不得不尝试并无法找到以下类 Systemjava.util.System (因为它位于导入中)、System.out java.util.System.outjava.lang.System.out

我只处理了MemberSelect。您将不得不处理其他可能性,包括方法调用。例如 new Object().toString().hashCode() 应该是 class=Object, method=hashCode。

关于Java 8,如何发现访问MethodIn Vocation中的类和方法名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com