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

如何从泛型实例中获取目标类名?

从泛型实例中获取目标类名可以通过Java的反射机制来实现。以下是一个示例代码:

代码语言:txt
复制
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericClass<T> {
    private Class<T> targetClass;

    public GenericClass() {
        Type superClass = getClass().getGenericSuperclass();
        if (superClass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) superClass;
            Type[] typeArguments = parameterizedType.getActualTypeArguments();
            if (typeArguments.length > 0) {
                targetClass = (Class<T>) typeArguments[0];
            }
        }
    }

    public Class<T> getTargetClass() {
        return targetClass;
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        GenericClass<String> genericClass = new GenericClass<>();
        Class<String> targetClass = genericClass.getTargetClass();
        System.out.println(targetClass.getName()); // 输出 "java.lang.String"
    }
}

在上述示例中,我们定义了一个泛型类GenericClass<T>,通过反射获取泛型实例的目标类名。在构造函数中,我们首先通过getClass().getGenericSuperclass()获取当前类的泛型父类,然后判断父类是否为ParameterizedType类型。如果是,我们可以通过getActualTypeArguments()方法获取泛型实例的类型参数数组,然后取第一个类型参数作为目标类。最后,我们提供了getTargetClass()方法来获取目标类的Class对象。

这种方法适用于获取直接继承泛型类的目标类名。如果存在多级继承关系,需要根据具体情况进行调整。

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

相关·内容

关于Java、反射和注解的扫盲篇

通用化的手段在于让数据类型变得参数化,定义时,对应的数据类型是不确定的,方法被调用时,会指定具体类型,其核心目标是为了解决容器类型在编译时安全检查的问题。   ...:一般用在、方法、接口中,叫做接口、方法 的使用 package demo.generic; import lombok.Data; /** * 的定义...************** * 私有的构造方法,序号:1 */ 如何获取的字段并使用 在我们上面自定义的ReflectTarget创建各种不同访问修饰符修饰的字段,用于测试...,但getDeclareField()方法是获取不到从父继承的字段的 如何获取的方法并调用 在在我们上面自定义的ReflectTarget创建被各种不同访问修饰符修饰的方法,用于测试...(+包),因此我们还需要记录哪些是通过反射来获取的。

17710
  • JavaWeb21-基础加强(注解;代理;加载器;反射

    它可以用于创建文档,跟踪代码的依赖性,甚至执行基本编译时检查。格式:注解是以‘@注解’在代码存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三。...,例如当使用集合时没有用 (Generics) 来指定集合保存的类型。...(全限定名); 若有class对象 可以new出来对象 获取所有的方法 获取所有的字段 若获取Method对象 如何让方法执行 Method m=Class,getMethod(...)...如果给定的二进制名称,那么加载器会试图查找或生成构成定义的数据。一般策略是将名称转换为某个文件,然后文件系统读取该名称的“文件”。...反射介绍 是应用于设计阶段。,接口,方法上都可以使用. 2. 反射常用api介绍 通过得到Class对象.

    83370

    Java

    一、为什么要有 【1】解决元素存储的安全性问题。 【2】解决获取数据元素时,需要类型强转的问题。 ? 【3】可以统一数据类型,便于操作。...} } 二、 定义在上的是在创建对象时确定: public class MyClass1 { /** 定义具有 * 修饰符 class {...super A>:可以存放A 及其父(带有超限定的可以写入),在是不能进行 super 向上转型的。...static class A {}; static class B extends A {}; static class C extends B {}; } 七、注意事项 1)、静态方法不能使用...2)、如果是一个接口或抽象,则不可创建的对象。 3)、不能在 catch 中使用。 4)、派生子类,类型需具体化。

    55820

    Java总结

    所谓,就是允许在定义、接口时通过一个标识表示某个属性的类型或者是某个方法的返回值及参数类型。...JDK1.5 改写了集合框架的全部接口和,为这些接口、增加了支持,从而可以在声明集合变量、创建集合对象时传入类型实参。 为什么要有如何使用?...的好处应用 优点:这样做极大地提升程序的灵活性,提升的扩展性,可以指代成员变量的数据类型,方法的返回值类型以及方法的参数类型。 在没有时 ?... public class Time { public static void main(String[]...换句话说,方法所属的,是不是都没有关系。 并且,方法可以是静态的,原因为:参数是在调用方法时确定的。并非在实例时确定。

    84430

    Scala:样例、模式匹配、Option、偏函数、(三)

    Scala:样例、模式匹配、Option、偏函数、 课程目标 掌握样例的使用 掌握模式匹配的使用 1....scala可以使用模式匹配来匹配样例,从而可以快速获取样例的成员数据。... scala和Java一样,和特质、方法都可以支持。我们在学习集合的时候,一般都会涉及到。...语法格式 def 方法名[名称](..) = { //... } 示例 示例说明 用一个方法来获取任意类型数组的中间的元素 不考虑直接实现(基于Array[Int]实现) 加入支持...接下来,我们来学习如何定义scala的 定义 语法格式 class [T](val 变量: T) 定义一个,直接在后面加上方括号,指定要使用的参数 指定对应的参数后,就使用这些类型参数来定义变量了

    2.3K20

    C# 基础知识系列- 10 反射和(二)

    上一篇文章大概介绍了一下和反射的一些基本内容,主要是通过获取对象的类型,然后通过这个类型对象操作对象。这一篇介绍一个在反射中很重要的内容:特性,以及上一篇未完成的内容——在反射中的引用。 ?...这个特性可以用在任何支持特性的地方,当这个特性标记一个的时候,目标的子类也将自动获取这个特性。...[Demo]标记,表示这个应用了特性DemoAttribute,也可以使用,但是C#会自动忽略结尾的Attribute。...反射中的 之前在《C# 基础知识系列- 5 和反射》介绍过,C#的不会在编译过程抹去痕迹,意思就是我们可以通过反射获取到对象的实际类型。那么如何获取呢?...但是在C#,我可以不用考虑这个问题。 4. 总结 反射在各大编程语言中是一个很重要的特点,、特性在扮演着很重要的角色。

    88030

    java 全解 - 绝对最详细

    2、的使用 的三种使用方式:方法,接口 2.1 概述:把定义在上 定义格式: public class { }复制代码 注意事项...,同时该类也是一个的情况下应该如何使用构造器:因为构造器可以显式指定自己的类型参数(需要用到菱形,放在构造器之前),而自己的类型实参也需要指定(菱形放在构造器之后),这就同时出现了两个菱形了...正因为无法确定具体的类型是什么,add方法受限(可以添加null,因为null表示任何类型),但可以列表获取元素后赋值给父类型。...Java这一概念提出的目的来看,其只是作用于代码编译阶段,在编译过程,对于正确检验结果后,会将的相关信息擦出,也就是说,成功编译过后的class文件是不包含任何信息的。...由于系统并不会真正生成,所以instanceof运算符后不能使用 4、与反射 把变量当成方法的参数,利用Method的getGenericParameterTypes方法来获取的实际类型参数

    3.9K20

    C#讲解反射和。让程序猿少掉头发

    这个特性可以用在任何支持特性的地方,当这个特性标记一个的时候,目标的子类也将自动获取这个特性。...[Demo]标记,表示这个应用了特性DemoAttribute,也可以使用,但是C#会自动忽略结尾的Attribute。...2.2、获取其他元素的特性 特性不止可以标记在上,还可以标记在属性、方法上。那么这些元素应该如何获取对应的特性呢?...3、反射中的 C#的不会在编译过程抹去痕迹,意思就是我们可以通过反射获取到对象的实际类型。那么如何获取呢?...var stuType = typeof(Student); // 获取参数 var genericTypes = stuType.GenericTypeArguments; var method

    64840

    03.Scala:样例、模式匹配、Option、偏函数、

    Scala:样例、模式匹配、Option、偏函数、 课程目标 掌握样例的使用 掌握模式匹配的使用 1....scala可以使用模式匹配来匹配样例,从而可以快速获取样例的成员数据。... scala和Java一样,和特质、方法都可以支持。我们在学习集合的时候,一般都会涉及到。...语法格式 def 方法名[名称](..) = { //... } 示例 示例说明 用一个方法来获取任意类型数组的中间的元素 不考虑直接实现(基于Array[Int]实现) 加入支持...接下来,我们来学习如何定义scala的 定义 语法格式 class [T](val 变量: T) 定义一个,直接在后面加上方括号,指定要使用的参数 指定对应的参数后,就使用这些类型参数来定义变量了

    2.1K20

    Java反射的使用姿势一览

    反射的学习使用 日常的学习工作,可能用到反射的地方不太多,但看看一些优秀框架的源码,会发现基本上都离不开反射的使用;因此本篇博文将专注下如何使用 本片博文布局如下: 反射是什么,有什么用,可以做什么...如何使用反射 实例: 利用反射方式,获取一个的所有成员变量的name及值 通过反射方式,修改对象的私有成员变量 会通过写一个BeanUtils实现对象的成员变量值拷贝来覆盖上面两个场景 ----...持有对象的映射关系,然后在注解,也可以达到上面的效果) 还有一种场景可能就比较蛋疼了,如果一个没有默认构造方法,通过反射就没法直接用class.newInstanace()了 ----...,子类作为参数 结合时,获取的实际类型 ,又是一个有意思的功能,这里不多说,继承一个,然后问题是如何通过反射获得签名的类型,一般会在继承或实现接口时会用到它。...可以用 Class#isPrimitive()判断是否为基本数据类型 可以用 Class#getGenericSuperclass() 获取类型 ---- V.

    72060

    java的反射

    –Class 对象只能由系统建立对象   –一个在 JVM 只会有一个Class实例   –每个实例都会记得自己是由哪个 Class 实例所生成 1: Class...(); //3.通过全(会抛出异常) //一般框架开发这种用的比较多,因为配置文件中一般配的都是全,通过这种方式可以得到Class实例...如果我们把全和方法名放在一个配置文件,就可以根据调用配置文件来执行方法 如何获取定义的(私有)方法   前面说一般使用getDeclaredMethod获取方法(因为此方法可以获取的私有方法...,然后获取注解的值进而判断我们赋值是否合法,那么对象的创建和方法的创建必须是通过反射而来的 4.反射与   定义一个 public class DAO { //根据id获取一个对象...//获取具体的参数 DAO //注意Type是一个空的接口,这里使用它的子类ParameterizedType,表示带参数的类型(即) if(type instanceof

    1.7K40

    Spring的注解与反射

    已知某个实例,通过调用该实例的getClass方法获取Class对象。...内置基本数据类型可以直接使用.Type获取。 利用ClassLoader(加载器)获取。...Java 采用擦除的机制来引入,Java 仅仅是给编译器 javac 使用的,目的是确保数据的安全性以及免去强制类型转换的问题。...在Java可以通过反射获取信息的场景有如下三个: (1)成员变量的 (2)方法参数的 (3)方法返回值的 在Java不可以通过反射获取信息的场景有如下两个: (1)或接口声明的...(2)局部变量的获取信息,必须要注意ParameterizedType,该类的getActualTypeArguments()方法可以有效获取信息。

    71910

    Java 高级开发必修知识---反射

    程序员的快乐 反射机制是在运行状态,对于任意一个,都能够知道这个的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为java...方法也是对象,方法是Method的对象 反射:某类的字节码表示 获取方法信息 1. c.getName() (1) 基本数据类型返回类型 (2) 返回包+的名称 2. c1.getSimpleName...如何获取某个方法? 方法的名称和方法的参数列表才能唯一决定某个方法 2. ...什么时候有效?  ...* * 说明编译之后集合的是去化的(编译完之后就没有存在了) * * java中集合的,是防止错误输入的,只在编译阶段有效

    85850

    【Java基础】JavaCore核心-技术

    @TOC 1.什么是 是在定义、接口和方法时,可以在声明时通过一定的格式指定其参数类型 使用时再指定具体的类型,从而使得、接口和方法可以被多种类型的数据所实例化或调用 这种可以在编译时进行参数类型检查的技术被称为...2.为什么要用 在没有之前,集合读取到的每一个对象都必须进行类型转换 如果插入了错误的类型对象,在运行时的转换处理就会出错 集合容器里面如果没指定类型,默认都是Object类型,那什么到可以插入...不能使用基本数据类型) 在后添加一对尖括号,并在尖括号填写类型参数 如果参数可以有多个,多个参数使用逗号分隔 (2)的定义 public class { private... 对象名 = new (); 注意 创建的使用没有指定类型,则默认是object类型 类型逻辑上看是多个类型,实际都是相同类型 Java 可以创建对应的对象和数组引用...主要原因是 Java 有类型擦除,任何类型在擦除之后就变成了 Object 类型或者对应的上限类型 那定义的如果需要用到数组,如何解决这个问题?

    36500

    反射反射 程序员的快乐

    反射:某类的字节码表示 获取方法信息 1.c.getName() (1)基本数据类型返回类型 (2)返回包+的名称 2.c1.getSimpleName() (1)返回不带包的名称...自行查看并尝试 或阅读帮助文档,查看Class的所有API 记住一点:在任何情况下想要获取一个的信息,首先要得到这个类型 得到类型,得到这个信息就轻而易举得到了 方法的反射 1.如何获取某个方法...通过Class,Method来认识的本质 什么是?...什么时候有效?...* * 说明编译之后集合的是去化的(编译完之后就没有存在了) * * java中集合的,是防止错误输入的,只在编译阶段有效,绕过编译就无效了 *

    93540

    C Sharp(十二)

    这样做可行,但是缺点明显: 我们要仔细检查类型的修改 每当新增类型,就要复制粘贴修改 调试维护这些类似的代码易出错 C# (generic)提供了更优雅的解决方案,让多个类型共享一组代码...我们可以使用类型占位符书写代码,在创建实例时指明实际类型即可。 C# 提供了 5 种可用在的地方: 、结构、接口、委托、方法。前四种是类型,最后一种是成员。...,看看如何创建并使用。...创建使用非有两步: 声明和创建实例。 但是不是实际,而是的模板,所以我们必须先从模板构建出实际类型,然后创建这个构建后的类型的实例。...SomeClass 创建实例创建实例: MyNonGenClass myNGC = new MyNonGenClass(); 创建实例: SomeClass<

    84020

    3小时Java入门

    静态属性和静态方法属于而不属于特定的实例,在实例之间共享。 可以通过直接调用静态属性和静态方法,也可以通过实例对象间接调用。 静态方法不能够通过this关键字使用实例属性。 ? ?...5,获取继承关系 ? ? 二十五, 就是编写模板代码来适应任意类型。Java的容器中大量使用了的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查。...Java的实现是使用的擦拭法,编译器编译包含时将换成Object类型, 编译器编译实例化的代码时根据的具体类型进行安全转型,而JVM虚拟机对一无所知。...因此的类型不能是int,float,double等基本类型,并且不能够获取的反射。 ? ?...Java中用尖括号来表示,Scala中用方括号来表示。 Java的数组用花括号来表示,Scala中一般用工厂方法。

    2.7K30

    《现代Typescript高级教程》和类型体操

    允许我们在定义中使用类型参数,以便在创建实例时指定具体的类型。...我们定义了一个 Stack,它使用类型参数 T 来表示堆栈的元素类型。...2. keyof 操作符和索引访问类型 keyof 操作符用于获取类型的所有属性,结合索引访问类型可以从一个类型获取属性的具体类型。...我们使用 keyof 操作符获取了 Person 接口的属性集合,并通过索引访问类型获取了 Person 接口中 name 属性的类型。...我们还可以结合和内置型函数来实现更复杂的类型操作。以下是一个示例,展示了如何使用 Pick 和来创建一个函数,该函数给定对象中选择指定属性,并返回一个新的对象。

    33730
    领券