首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从方法签名返回类型获取泛型类型

从方法签名返回类型获取泛型类型的方法有多种,以下是其中一种常用的方法:

  1. 使用反射机制:通过反射可以获取方法的签名信息,并从中解析出返回类型的泛型类型。
代码语言:txt
复制
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericTypeExample {
    public static void main(String[] args) throws NoSuchMethodException {
        Method method = GenericTypeExample.class.getMethod("exampleMethod");
        Type returnType = method.getGenericReturnType();

        if (returnType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) returnType;
            Type[] typeArguments = parameterizedType.getActualTypeArguments();

            for (Type typeArgument : typeArguments) {
                System.out.println("Generic type argument: " + typeArgument);
            }
        }
    }

    public List<String> exampleMethod() {
        return new ArrayList<>();
    }
}

上述代码中,我们通过反射获取了exampleMethod方法的返回类型List<String>的泛型类型String

  1. 使用字节码工具库:一些字节码工具库(如ASM、Byte Buddy)可以解析字节码文件,从中获取方法的签名信息和泛型类型。
代码语言:txt
复制
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.method.ParameterDescription;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.matcher.ElementMatchers;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class GenericTypeExample {
    public static void main(String[] args) throws NoSuchMethodException {
        DynamicType.Unloaded<GenericTypeExample> dynamicType = new ByteBuddy()
                .subclass(GenericTypeExample.class)
                .method(ElementMatchers.named("exampleMethod"))
                .intercept(FixedValue.value(""))
                .make();

        Class<? extends GenericTypeExample> loadedType = dynamicType
                .load(GenericTypeExample.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
                .getLoaded();

        Method method = loadedType.getMethod("exampleMethod");
        Type returnType = method.getGenericReturnType();

        if (returnType instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) returnType;
            Type[] typeArguments = parameterizedType.getActualTypeArguments();

            for (Type typeArgument : typeArguments) {
                System.out.println("Generic type argument: " + typeArgument);
            }
        }
    }

    public List<String> exampleMethod() {
        return null;
    }
}

上述代码中,我们使用了Byte Buddy库来生成一个临时的子类,并拦截了exampleMethod方法的返回值,使其返回一个空字符串。然后,我们通过反射获取了该方法的返回类型List<String>的泛型类型String

以上是两种常用的方法,可以根据具体的需求选择适合的方法来获取方法签名返回类型的泛型类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

切面获取方法T的真实类型

制造问题的是起头的这三个方法。如 selectByPrimaryKey这个方法,由于这是一个方法,其返回值为T 。...而ServiceMock的录制回放的基本套路就是通过获取到被录制的方法返回类型来进行回放。...而如果是方法,那么returnType的结果就是“T”或者是”List”, 这也就意味着以下反序列化方法的执行失败。...这样,只要获取到了切点中正在执行方法返回值(原始类型或者是某个类的实例),然后根据返回值来获取到Class,并最终获取到Type。这样就可以继续愉快地进行反序列化了。...returnType.getTypeName().equals("T") || returnType.getTypeName().equals("java.util.List")) { 对于T 或者是List的方法

2.2K30

如何通过Java反射获取类型信息

的使用场景 在讨论如何用反射获取类型之前,我们先来回顾下,在Java里面什么时候会使用,了解这个问题之后,我们才能继续思考如何用反射获取类型。...在Java里面可以通过反射获取信息的场景有三个,分别是: (1)成员变量的 (2)方法参数的 (3)方法返回值的 注意,通过对象本身也是没法获取的。...不能通过发射获取类型信息的场景有二个,分别是: (1)类或接口声明的信息 (2)局部变量的信息 获取方法返回值的类型 如下面定义的一个测试类: public class MyClass...getStringList方法返回值的类型信息的代码如下: public static void getMethodReturnType() throws Exception{ Method...:"+realType); } } } } 总结 本文主要介绍了如何使用反射来获取部分参数的类型信息,并介绍了那些场景不能使用反射获取类型信息

8.9K21

如何获取类的参数化类型

类的类型签名,编译后存储在该类的class文件结构的属性表的Signature属性中;字段的类型签名,编译后存储在该字段结构的属性表的Signature属性中;方法方法签名,编译后存储在该方法结构的属性表的...那么,我们如何通过反射获取一个类的参数化类型T的实际类型呢?...这样我们就可以类型签名中拿到参数T的实际类型为Job。...如何获取T的实际类型 以jackson框架的TypeReference类为例,TypeReference的源码如下(为了便于读者理解,我简化了): public abstract class TypeReference...实例的getGenericSuperclass方法获取父类; 3、最后调用Type的getActualTypeArguments方法获取父类的参数实际类型; 也叫参数化类型ParameterizedType

5.5K20

类、方法类型通配符的使用

类、方法类型通配符的使用 一.类        类的声明和非类的声明类似,除了在类名后面添加了类型参数声明部分...和方法一样,类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个参数,也被称为一个类型变量,是用于指定一个类型名称的标识符。...下面是定义方法的规则: 所有方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的)。...类型参数能被用来声明返回类型,并且能作为方法得到的实际参数类型的占位符。 方法体的声明和其他方法一样。...下面的例子演示了"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。该例子中的方法返回三个可比较对象的最大值。

3.7K40

【Flutter】Dart ( 类 | 方法 | 特定类型约束的 )

文章目录 一、Dart 类与方法 二、Dart 中的特定类型约束 三、Dart 自带 四、完整代码示例 五、 相关资源 一、Dart 类与方法 ---- 作用 : 为 类 ,...接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ; 类 : 提高代码复用程度 ; 方法 : 参数或返回值有类型约束 , 参数或返回类型必须符合对应的类型 , 使用时会进行类型检查约束...("age"); print("测试, 类型整型, 获取的缓存内容为 ${value2}"); } } 打印结果 : I/flutter (24673): 测试, 类型字符串, 获取的缓存内容为...Tom I/flutter (24673): 测试, 类型整型, 获取的缓存内容为 18 二、Dart 中的特定类型约束 ---- 还可以进行特定类型约束 , 如指定该类型必须是某个类的子类...(24673): 测试, 类型整型, 获取的缓存内容为 18 I/flutter (24673): 类测试, 获取的 T extends Person 的 name 字段为 Tom 五、

4.7K00

java typereference_Java | Jackson TypeReference获取类型信息「建议收藏」

本文以Jackson为例介绍TypeReference实现涉及的反序列化,及TypeReference的实现原理。...对于获取类型信息的场景,TypeReference是一个可以参考的通用解决方案。 实例 Jackson ObjectMapper的readValue可以将Json字符串反序列化为Java对象。...换一种方式实现 既然不能用List.class, 那如果我告诉ObjectMapper的readValue方法,我要的是List类型,但返回类型是List, 会发生什么呢?...抽象类TypeReference用于通过子类获取完整的类型信息。...Class的genericInfo: 总结Jackson ObjectMapper 提供了TypeReference支持对对象的反序列化; 对于获取类型信息的场景,TypeReference是一个可以参考的通用解决方案

2K10

Go:如何通过comparable接口实现类型安全

是现代编程语言中一种重要的特性,它允许在保持代码类型安全的前提下,编写灵活且可重用的代码。在Go语言中,引入主要是为了解决代码重用和类型安全的问题。...下面将详细解释如何在Go语言中保证类型安全。 什么是类型安全? 类型安全意味着编译器能够验证各种操作是否按照预期的数据类型进行。...如何增强类型安全 减少类型断言和类型转换的需求:在没有的情况下,例如在Go早期版本中,常常需要使用空接口(interface{})来处理不确定类型的数据。...引入后,可以在定义函数或数据结构时指定具体的类型参数,从而避免了大量的类型断言和转换。...型函数或类型的用户可以清楚地看到哪些类型是允许的,这避免了因类型错误而导致的逻辑错误。同时,还支持创建能够操作多种数据类型的通用算法,而不需要重复代码。

7410

如何在运行时(Runtime)获得的真正类型

前言 由于Java 的类型擦除机制,在编译时都被转为了Object,例如List经过编译之后将变为类型 List。...可以通过以下的方式再运行时获得的真正类型 如何获得具体类型 List 例子如下 来自:https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list...e.printStackTrace(); } } } 实际二者都利用的反射,都是基于 java.lang.reflect.ParameterizedType jackson 中如何反序列化...,但是没有指定Map里边存放的数据是什么类型,所以得到结果之后还需要对 Object name 做一次强制类型转换才能够使用。...通过 TypeReference 获得真正类型 代码类似如下,最后得到的 tmpType1 是 Class 类型,就能够基于它其他的操作了。

2.7K20

当类的相关时,如何在两个类之间创建类似子类型的关系呢

,在执行类型调用时,将Number作为其类型参数传递,如果参数是Number的子类型,则允许任何后续的add调用: Box box = new Box(); box.add...那么问题来了,当类的相关时,如何在两个类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型的对象是如何实现子类型化的吧。...小结:可以通过继承类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个类之间创建类似子类型的关系“的问题。...类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建类或接口之间的关系。

2.8K20

C#学习笔记四: C#2.0 可控类型 匿名方法和迭代器

另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1, 1.1 是什么 的英文表述是"generic", 这个单词意为通用的。...字面意思可知,代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化, 从而达到之实现一个方法就可以操作多种数据类型的目的。...是将方法实现行为与方法操作的数据类型分离,实现了代码重用。...而是避免性能损失的有效方法. 1.2全面解析 在前面的代码中, T就是类型参数. 无论调用类型方法还是初始化实例, 都需要用真实类型来替换T....图中可以看出每个封闭的类型都有属于它自己的静态字段.

1.2K110

类型即正义,TypeScript 入门到实践(四):5000字长文带你重新认识

{ return info; } 我们编写了一个获取图雀教程信息的函数,接收 info 输入,然后返回 info ,即明确参数类型返回类型一样。...在之前的内容中,我们通过命名函数来讲解了,那么匿名函数如何使用了?...当然数组的表达形式还有另外一种: Array 即以调用的形式返回一个关于变量 T 的数组类型。...因为派生类 TodoInput 可以获取到父类的属性和方法,所以在 TodoInput 中使用的 this.props 和 this.state 在被类型注解之后,就可以在编码时自动补全,你在写代码的时候应该可以享受到如下好处...类型别名 因为在很多场景下,类型别名和接口充当类似的角色,所以在了解完接口之后,我们有必要来了解学习一下类型别名如何结合使用,和接口类似,将上面的接口 Profile 用类型别名重写如下

1.7K20

根据java编译器规则在Class中搜索匹配指定参数类型表的方法(GenericMethod)

在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的方法。...void test(int a,URL b,T c){ } public void test(T1 a,T2 b,T3 c){ } } 于是对java关于方法匹配的方式做了研究...,发现java编译器在匹配方法时,对参数的匹配是遵循从左到右的顺序来一个个检查的,根据这个规则写了下面的方法来实现方法的精确匹配。.../** * @param clazz 要搜索的类 * @param name 方法名 * @param parameterTypes 希望匹配的参数类型数组 *...put(double.class, Double.class); } }; 补充说明 细心严谨的读者可能会发现这里面的逻辑并不十分严谨,可能会出现返回并不匹配方法的结果

1.6K30
领券