gpt4 book ai didi

java - ClassVisitor#visitTypeAnnotation 和 MethodVisitor#visitTypeAnnotation 的例子是什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:11 25 4
gpt4 key购买 nike

我正在学习asm,我发现了两个有趣的api

org.objectweb.asm.ClassVisitor

/**
* Visits an annotation on a type in the class signature.
*/
public AnnotationVisitor visitTypeAnnotation(int typeRef,
TypePath typePath, String desc, boolean visible);

并在org.objectweb.asm.MethodVisitor

/**
* Visits an annotation on a type in the method signature.
*
*/
public AnnotationVisitor visitTypeAnnotation(int typeRef,
TypePath typePath, String desc, boolean visible);

但是什么情况下我们会使用这两种方法..

我们如何在 java 中生成一个带有类/方法签名中类型注释的类?

我试试

 public @Z Integer testMethod(String testParam)

但是 @Z 仍然被 visitAnnotation 调用而不是 visitTypeAnnotation...

什么情况下 asm 会调用 visitTypeAnnotation?

谢谢~

最佳答案

Type annotations是一项新的 Java 8 功能。为了使注释能够在类型上下文中使用,注释类型本身必须使用 @Target( ElementType.TYPE_USE ) 进行注释,但请注意,当注释支持目标时METHOD同时,声明如

public @Z Integer testMethod(String testParam)

是歧义。 Afaik,然后将为方法和返回类型记录注释。同样,像这样的声明

public Integer testMethod(@Z String testParam)

如果 @Z 同时支持 PARAMETER 目标,将会产生歧义。


可以出现类型注释的独特用途示例是

public Integer testMethod(List<@Z String> testParam) throws @Z RuntimeException {
return new @Z Integer(testParam.get((@Z int)0));
}

如果与 documentation of MethodVisitor.visitTypeAnnotation 比较您可能会认出 typeRef 列出的可能值。

如果您想知道 METHOD_RECEIVER 是如何被注释的,这是一种新的 Java 8 语法,可能并不为人所知:

class Example {
void instanceMethod(@Z Example this, int firstOrdinaryParameter) {
}
}

在这个例子中,instanceMethod()的方法接收者类型是@Z Example而不是Example,虽然这个区别没有意义到 Java 语言本身。

关于java - ClassVisitor#visitTypeAnnotation 和 MethodVisitor#visitTypeAnnotation 的例子是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646357/

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