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

如何使用反射获得泛型类型的正确文本定义?

要获取泛型类型的正确文本定义,可以使用Java反射API。以下是一个简单的示例,说明如何使用反射获取泛型类型的正确文本定义:

代码语言:java
复制
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.List;

public class GenericReflectionExample {

    public static void main(String[] args) {
        Type genericType = getGenericType(MyClass.class, List.class);
        System.out.println("泛型类型的正确文本定义: " + genericType);
    }

    private static Type getGenericType(Class<?> clazz, Class<?> genericInterface) {
        Type[] genericInterfaces = clazz.getGenericInterfaces();
        for (Type genericInterfaceType : genericInterfaces) {
            if (genericInterfaceType instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) genericInterfaceType;
                if (parameterizedType.getRawType().equals(genericInterface)) {
                    return parameterizedType.getActualTypeArguments()[0];
                }
            }
        }
        return null;
    }

    public static class MyClass implements List<String> {
        // ...
    }
}

在这个示例中,我们定义了一个名为MyClass的类,它实现了List<String>接口。我们使用getGenericType方法获取MyClass类的泛型类型。getGenericType方法接受两个参数:一个是要获取泛型类型的类,另一个是要获取泛型类型的接口。

getGenericType方法中,我们首先获取类的所有泛型接口,然后遍历这些接口,检查它们是否是ParameterizedType类型。如果是,我们检查其原始类型是否与给定的泛型接口相同,如果相同,则返回泛型类型的实际类型参数。

在这个示例中,MyClass类实现了List<String>接口,因此getGenericType方法将返回String类型。

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

相关·内容

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

前言 关于Java,很多人都有一个误解,认为Java代码在编译时会擦除类型,从而在运行时导致没法访问其类型,这其实并不完全正确,因为有一部分信息是可以在运行时动态获取,这部分信息基本能够满足我们日常开发中大多数场景...使用场景 在讨论如何反射获取类型之前,我们先来回顾下,在Java里面什么时候会使用,了解这个问题之后,我们才能继续思考如何反射获取类型。...不能通过发射获取类型信息场景有二个,分别是: (1)类或接口声明信息 (2)局部变量信息 获取方法返回值类型 如下面定义一个测试类: public class MyClass...:"+realType); } } } } 总结 本文主要介绍了如何使用反射来获取部分参数类型信息,并介绍了那些场景不能使用反射获取其类型信息...,通过反射获取参数类型信息其实是非常有用一个功能,比如在一些json工具开源包里面,可以对Java里面泛各种List,List等类型正确识别,其实就是利用反射这个功能,从而让解析代码具有更强通用

8.9K21

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

类、方法、类型通配符使用 一.类        声明和非声明类似,除了在类名后面添加了类型参数声明部分...如下实例演示了我们如何定义一个类: 1 public class Box { 2 3 private T t; 4 5 public void add(T t)...下面是定义方法规则: 所有方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中)。...下面的例子演示了"extends"如何使用在一般意义上意思"extends"(类)或者"implements"(接口)。该例子中方法返回三个可比较对象最大值。...List类型,所以name,age,number都可以作为这个方法实参,这就是通配符作用 2、类型通配符上限通过形如List来定义,如此定义就是通配符值接受Number及其下层子类类型

3.7K40

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

前言 由于Java 类型擦除机制,在编译时都被转为了Object,例如List经过编译之后将变为类型 List。...可以通过以下方式再运行时获得真正类型 如何获得具体类型 List 例子如下 来自:https://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list...,都是基于 java.lang.reflect.ParameterizedType jackson 中如何反序列化 jackson 中将JSON 转为Map 可以通过如下代码实现,方式一: ObjectMapper...可以使用方式二,告知实际 Map 中存放对象,从而得到正确类型,代码如下所示: ObjectMapper mapper = new ObjectMapper(); String json = "{\...实际上也是根据 ParameterizedType 获得真正类型

2.6K20

android 如何正确使用 和 多参数 “偷懒”

个选项,采用布局是一个 TextView 对应一个小三角 ImageView,各个选项没被点击时,字体颜色是 黑色,小三角不显示,点击后,字体变色,小三角居下显示,同时在下面的 layout 显示对应布局内容...要实现这样逻辑,并不难,但是,如果常规地去写的话,代码段很长,很繁琐!后来我这样做了。...先写个获取 list 型函数,用来获取 要显示布局集合 再写个获取 TextView 和 ImageView 对应绑定 Map 型函数 最后是整合,集体改变 这样调用 那么我们就配置好了一个选项...,上面共四个选项,对应四个点击事件,就是写四次,你只需要改变,传入整数,其他不用便,0,1,2,3.....

1.3K90

Java Generic 自定义如何定义定义边界共变性,逆变性对象比较

如何定义 考虑我们要实现了一个节点对象,这个对象可以自定义类型,我们可以用语法进行如下定义: package Generic; public class Node { private...; E next(); void remove(); } 自定义边界 在定义时候,可以定义边界,例如下面的例子 class Animal {} class Human...extends定义指定真正形态时候,必须是animal子类,你可以使用animal与human来指定形态,但不可以使用toy来指定,因为toy不是animal子类。...: 在程序中对Basket类型判断是不合法,因为java采用类型擦除,也就是说,在程序中语法类型指定,仅给编译器使用,执行时无法获取类型信息,因而instanceOf在执行器对比时...,仅能根据basket类型进行对比,无法针对当众实际类型进行对比 如果想要通过编译,就要使用通配符?

1.1K10

Java 基础(一)| 使用正确姿势

顾名思义,就是将类型由原来具体类型参数化 (动词),类似于方法中变量参数,此时类型定义成参数形式(可以称之为类型形参), 然后在使用 / 调用时传入具体类型类型实参)。...本质是为了参数化类型(在不创建新类型情况下,通过指定不同类型来控制形参具体限制类型)。也就是说在使用过程中。...三、详解 3.1 类 由我们指定想要传入类中类型,把定义在类上,用户使用该类时候,才把类型明确下来,比如:定义一个万能实体数据暂存工具类。...有时候我们只想在方法中使用,可以这么定义: 值得注意是: 与类不同,方法在调用时才确定最终类型 若有返回值,返回值不需要强转 package com.nasus.generic.how;...3.8 使用规范 1、不能实例化类 2、静态变量或方法不能引用类型变量,但是静态方法是可以 3、基本类型无法作为类型 4、无法使用 instanceof 关键字或 == 判断类型

54720

如何获取参数化类型

如List,类型擦除后为裸类型List。 支持类型界定,即限定T是某个类子类,使用extends关键字实现。...JVM在执行字节码指令时并不关心参数T实际类型是什么,只使用擦除后类型。Signature属性是用于调试和反射以及将class文件反编译为Java代码时使用。...那么,我们如何通过反射获取一个参数化类型T实际类型呢?...TypeReference作用就是能够让jackson获取到List参数类型,而不需要传递一个Class。jackson最终通过反射拿到T实际类型。...如何获取T实际类型 以jackson框架TypeReference类为例,TypeReference源码如下(为了便于读者理解,我简化了): public abstract class TypeReference

5.5K20

Day14 自己定义使用

引入和体现: 问题:集合中能够存储各种类型元素,可是由于集合能够存储各种类型数据。在获取集合中元素时,就会造成数据不安全。...实现方式:在定义集合时明白了该集合中能够存储元素类型 使用格式: 注意:中仅仅能使用引用类型 package org.test; import java.util.ArrayList...import java.util.List; public class TestGeneric { public static void main(String[] args) { //自己定义使用...//1.实例化对象时指明类型,这儿不能一般类型,仅仅能是引用类型 //全部使用类型地方。...不能缺少 public E getE(E e) { return e; } } //子类还是不确定类型T ,实例化子类对象时候要指明引用类型 //继承类或接口时

45220

使用反射简化Golang查询数据库代码方案

大纲 Postgresql数组 案例 常规写法 定义结构体 查询数据 问题 反射+写法 结构体定义 接口 Tag 实现逻辑 设计 实例化模型结构体 获取表名 过滤字段 组装SQL语句...常规做法是我们将该字段设计为字符串或者文本类型,存储“1,2,3,4”;在业务逻辑中,数据取出后,我们使用“,”进行切分,并将字符串“1”“2”“3”转换为整型,最后组成数组[1,2,3,4]。...反射+写法 结构体定义 type Model interface { GetTableName() string } type Employee struct { Id...而裸指针类型是uintptr,就需要使用reflect.NewAt函数对其进行转换。...(error) return } models = append(models, *singleRow) } return } 小结 +反射方案虽然复杂,但是后续其他表查询则会变得非常简单

1.1K40

java:通过自定义ParameterizedType实现参数化类型类型参数替换

需求说明 如果要动态构造一个参数对象(ParameterizedType),guava提供TypeToken工具可以部分实现这个功能: 比如下面这个例子(来自guava wiki TypeToken...),可以根据需要定制一个指定K,V类型Map。...虽然 ParameterizedType接口方法也没几个,但如何自己写个ParameterizedTypeImpl呢? 别逗了,还真打算从头自己写一个啊,再说自己敢用么?...ParameterizedTypeImpl(TypeToken.of(this).getRawType(), typeArgs, getOwnerType()); } /** * 用指定类型参数替换当前对象类型参数... * 新参数个数与当前对象类型参数个数必须一致, * 如果新参数数组中元素为{@code null}则对应参数不会被替换 * @param newTypeArguments

4.6K80

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

那么问题来了,当类相关时,如何在两个类之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...为了搞懂这个问题,我们先来了解一下同一类型对象是如何实现子类型吧。...如果我们想要定义我们自己列表接口PayloadList,使得类型P可选值与每个元素相关联,可以定义如下: interface PayloadList extends List {...小结:可以通过继承类或者实现接口来对其进行子类型化。 搞懂了子类型问题,我们回到“如何在两个类之间创建类似子类型关系“问题。...类或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建类或接口之间关系。

2.8K20

使用通配符和:完成父子类关系List对象类型匹配

和通配符 使用和通配符都可以让一个方法所表示算法逻辑适应多种类型。...Java中具备继承关系类A、B(A extends B)它们集合List和List之间是没有继承关系, 可以使用或通配符来让一个方法支持同时接受List和List。...可以通过通配符或者方法实现。 通配符实现 使用List这样形参,就可以接收集合项为Animal子类任意List。...方法实现 抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应具体Animal子类型是一致,那么就需要用到了: public ...参数也可以是多个,而且之间存在关系。 小结 以上通过一个不太实际案例说明了使用和通配符来解决List集合之间“匹配”问题。这也是它们主要用途之一。

1.5K70

JAVA 重载是运行时决定还是编译时候决定?正确使用

参考链接: 重载Java中main() 首先看个例子  第一个片段A部分 传入实际类型是String希望调用C片段,但是实际上是调用B。    敲黑板:Java是运行时就擦除了。 ...我们看下Optional如何可以准确找到isEmpty(String s)  Optional str = Optional.of("me");         str.ifPresent...(v->{             boolean exit = Util.isEmpty(v);         });  解决和建议:  一个是去掉,避免同一后再细化。...== 0;     }     throw new SysException("unkown classType {}", clazz.getCanonicalName());     } 另外判断类型是否是某个接口子类实现或者本身正确姿势...    System.out.println(null instanceof String);     System.out.println(String.class.isInstance("a"));  正确使用

45320

使用通配符和:完成父子类关系List对象类型匹配

和通配符 使用和通配符都可以让一个方法所表示算法逻辑适应多种类型。...Java中具备继承关系类A、B(A extends B)它们集合List和List之间是没有继承关系, 可以使用或通配符来让一个方法支持同时接受List和List。...可以通过通配符或者方法实现。 通配符实现 使用List这样形参,就可以接收集合项为Animal子类任意List。...方法实现 抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应具体Animal子类型是一致,那么就需要用到了: public ...参数也可以是多个,而且之间存在关系。 小结 以上通过一个不太实际案例说明了使用和通配符来解决List集合之间“匹配”问题。这也是它们主要用途之一。 (本文使用Atom编写)

2.4K00

【Vue3】解锁Vue3黑科技:探索接口、和自定义类型前端奇迹

文章目录介绍接口定义类型接口、、自定义相对比结论介绍在Vue3中,我们不仅可以利用其强大响应式系统和组件化开发来构建灵活前端应用程序,还可以利用TypeScript(简称TS)特性来增强代码可读性...在本文中,我们将深入探讨Vue3中接口、和自定义类型使用,以便更好地利用这些功能来构建优秀Vue应用接口首先我们介绍一下接口接口在Vue3中是一种定义对象结构方式,它可以用来描述对象形状,包括属性和方法...、自定义相对比接口 vs :接口用于描述对象形状,用于增强代码灵活性。...接口在定义对象结构时更为直观,而适用于编写通用、适用于多种类型代码。 vs 自定义类型用于增强代码灵活性,而自定义类型用于提高代码可读性和类型安全性。...可以用于编写通用代码,而自定义类型用于定义具体类型结构。结论在Vue3中,接口、和自定义类型是强大工具,可以帮助我们编写更加健壮、灵活和可维护代码。

18710

拼夕夕三轮面经:被问到反射bug,你中招了吗?

综上,反射调用方法,是以反射获取方法时传入方法名和参数类型来确定调用方法。 2 类型擦除 允许SE使用类型参数替代精确类型,实例化时再指明具体类型。...利于代码复用,将一套代码应用到多种数据类型类型检测,可以在编译时检查很多编码错误。但由于历史兼容性而妥协类型擦除方案,在运行时还有很多坑。...案例 现在期望在类字段内容变动时记录日志,于是SE想到定义一个父类,并在父类中定义一个统一日志记录方法,子类可继承该方法。上线后总有日志重复记录。...Base时将String作为T类型,并使用 @Override 注解 setValue 但还是出现重复日志 Sub2setValue竟然调用了两次,难道是JDK反射有Bug!...这就是因为类型擦除。 反射擦除“天坑” Java类型在编译后被擦除为Object。

48730
领券