没有将泛型类型的TYPE_USE注释编译到类文件中

问题描述 投票:1回答:1

我想通过我的Spring Boot应用程序为具有多个@Valid元素的有效载荷定义一个通用类,使其成为@Validated。这堂课正在上图书馆。

如果我定义的通用类如下:

class GroupPayload<T> {
    @Size(min = 1) List<@Valid T> data;
}

当编译时,类文件看起来像:

class GroupPayload<T> {
    @Size(
        min = 1
    )
    private List<T> data; // T is not @Valid !?
}

即使@Size到达类文件,@Valid注释(两个注释都具有@Retention(RUNTIME)),在编译的类中,T都不用@Valid键入。

如果我使用MyGroupPayload extends GroupPayload<MyType>,则验证不会对元素进行[[not,但是如果我使用具有List<@Valid MyType> data验证的硬编码(非通用)类,则可以使用。

如何将通用类型的TYPE_USE注释获取到已编译的类中,以便可以将其用作直接项目之外的库类。
java generics annotations spring-annotations
1个回答
1
投票
批注

are编译到类文件中。我怀疑您用来检查类文件的任何工具都是错误的。

这里是MWE:

import java.util.List; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.TYPE_USE) @interface Valid{} public class GroupPayload<T> { List<@Valid T> data; }

输出

javac GroupPayload.java javap -v GroupPayload.class

出现在下面。您可以从以下代码片段中看到:

... #9 = Utf8 LValid; ... java.util.List<T> data; ... RuntimeInvisibleTypeAnnotations: 0: #9(): FIELD, location=[TYPE_ARGUMENT(0)]

@Valid注释在.class文件中。

这里是javap -v GroupPayload.class的完整输出:

Classfile /home/mernst/GroupPayload.class Last modified Jan 16, 2020; size 515 bytes MD5 checksum 3db07417a8da20b35032650b64e9ffce Compiled from "GroupPayload.java" public class GroupPayload<T extends java.lang.Object> extends java.lang.Object minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #3.#22 // java/lang/Object."<init>":()V #2 = Class #23 // GroupPayload #3 = Class #24 // java/lang/Object #4 = Utf8 data #5 = Utf8 Ljava/util/List; #6 = Utf8 Signature #7 = Utf8 Ljava/util/List<TT;>; #8 = Utf8 RuntimeInvisibleTypeAnnotations #9 = Utf8 LValid; #10 = Utf8 <init> #11 = Utf8 ()V #12 = Utf8 Code #13 = Utf8 LineNumberTable #14 = Utf8 LocalVariableTable #15 = Utf8 this #16 = Utf8 LGroupPayload; #17 = Utf8 LocalVariableTypeTable #18 = Utf8 LGroupPayload<TT;>; #19 = Utf8 <T:Ljava/lang/Object;>Ljava/lang/Object; #20 = Utf8 SourceFile #21 = Utf8 GroupPayload.java #22 = NameAndType #10:#11 // "<init>":()V #23 = Utf8 GroupPayload #24 = Utf8 java/lang/Object { java.util.List<T> data; descriptor: Ljava/util/List; flags: Signature: #7 // Ljava/util/List<TT;>; RuntimeInvisibleTypeAnnotations: 0: #9(): FIELD, location=[TYPE_ARGUMENT(0)] public GroupPayload(); descriptor: ()V flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 8: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this LGroupPayload; LocalVariableTypeTable: Start Length Slot Name Signature 0 5 0 this LGroupPayload<TT;>; } Signature: #19 // <T:Ljava/lang/Object;>Ljava/lang/Object; SourceFile: "GroupPayload.java"

© www.soinside.com 2019 - 2024. All rights reserved.