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

如何从类引用或泛型类型获取属性引用?

从类引用或泛型类型获取属性引用可以通过Java的反射机制实现。下面是一个示例代码:

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

public class PropertyUtil {

    public static Field getPropertyField(Class<?> clazz, String propertyName) {
        try {
            return clazz.getDeclaredField(propertyName);
        } catch (NoSuchFieldException e) {
            if (clazz.getSuperclass() != null) {
                return getPropertyField(clazz.getSuperclass(), propertyName);
            } else {
                return null;
            }
        }
    }

    public static Class<?> getPropertyType(Class<?> clazz, String propertyName) {
        Field field = getPropertyField(clazz, propertyName);
        if (field != null) {
            return field.getType();
        }
        return null;
    }

    public static Class<?> getGenericType(Field field) {
        if (field.getGenericType() instanceof ParameterizedType) {
            ParameterizedType genericType = (ParameterizedType) field.getGenericType();
            Type[] actualTypeArguments = genericType.getActualTypeArguments();
            if (actualTypeArguments.length > 0) {
                return (Class<?>) actualTypeArguments[0];
            }
        }
        return null;
    }

    public static void main(String[] args) {
        Class<Student> studentClass = Student.class;

        Field nameField = getPropertyField(studentClass, "name");
        System.out.println("Name field: " + nameField);

        Class<?> nameFieldType = getPropertyType(studentClass, "name");
        System.out.println("Name field type: " + nameFieldType);

        Field scoreField = getPropertyField(studentClass, "scores");
        System.out.println("Scores field: " + scoreField);

        Class<?> genericType = getGenericType(scoreField);
        System.out.println("Scores field generic type: " + genericType);
    }
}

class Person {
    protected String name;
}

class Student extends Person {
    private List<Integer> scores;
}

上述代码定义了一个PropertyUtil工具类,其中的getPropertyField方法可以根据类引用和属性名获取对应的Field对象,getPropertyType方法可以根据类引用和属性名获取对应的属性类型。getGenericType方法可以从泛型类型的属性中获取泛型的实际类型。

示例中的main方法展示了如何使用这些工具方法。首先获取Student类的name属性的Field对象和类型,然后获取scores属性的Field对象和泛型类型。

请注意,反射机制对于性能和安全性可能会有一些开销和风险,因此在实际开发中应该谨慎使用。

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

相关·内容

【Kotlin】:: 双冒号操作符详解 ( 获取引用 | 获取对象类型引用 | 获取函数的引用 | 获取属性引用 | Java 中的 Class 与 Kotlin 中的 KClass )

文章目录 一、:: 双冒号操作符 1、获取引用 引用类型 KClass 说明 2、获取对象类型引用 3、获取函数的引用 4、获取属性引用 二、 java.lang.Class 与 kotlin.reflect.KClass...一、:: 双冒号操作符 ---- 在 Kotlin 中 , :: 双冒号操作符 的作用是 获取 , 对象 , 函数 , 属性类型对象 引用 ; 获取的这些引用 , 并不常用 , 都是在 Kotlin...1、获取引用 在 Kotlin 中 , 使用 :: 双冒号操作符 获取 类型对象引用 代码格式为 : JavaKotlin名::class 获取的 Kotlin 类型对象 的类型...为 KClass , 如 : 获取 String 字符串类型引用 , 代码为 : String::class 获取的 String 引用类型 为 KClass , 代码示例...} 2、获取对象类型引用 在 Kotlin 中 , 使用 :: 双冒号操作符 获取 对象类型引用 代码格式为 : JavaKotlin实例对象::class 获取的 对象类型引用类型 为 KClass

4.7K11

Java如何优雅获取类型

public int compareTo(DataClass o) { return 0; }} 上面的例子中,子类定义了,但获取类型是在父。...如何实现? 先说结论:通过 Java 反射包的 ParameterizedType 工具获得具体类型。...关键地方来了,调用 getGenericSuperclass 方法,这个方法的作用是:返回表示此 Class 所表示的实体(、接口、基本类型 void)的直接超的 Type。...因为每个可以有多个。 ? 通过这样几行代码,我们就得到了。当然,这种用法很少。 现在我们知道了如何得到,那么,就将刚刚的场景中的问题解决。...(Son)的 Class,获取数组,返回第一个(因为我们只有一个类型的 Class。

11.9K30
  • Java如何优雅获取类型

    public int compareTo(DataClass o) { return 0; }} 上面的例子中,子类定义了,但获取类型是在父。...如何实现? 先说结论:通过 Java 反射包的 ParameterizedType 工具获得具体类型。...关键地方来了,调用 getGenericSuperclass 方法,这个方法的作用是:返回表示此 Class 所表示的实体(、接口、基本类型 void)的直接超的 Type。...因为每个可以有多个。 ? 通过这样几行代码,我们就得到了。当然,这种用法很少。 现在我们知道了如何得到,那么,就将刚刚的场景中的问题解决。...(Son)的 Class,获取数组,返回第一个(因为我们只有一个类型的 Class。

    2.6K10

    Java如何优雅获取类型

    compareTo(DataClass o) { return 0; }} 上面的例子中,子类定义了,但获取类型是在父。...如何实现? 先说结论:通过 Java 反射包的 ParameterizedType 工具获得具体类型。...关键地方来了,调用 getGenericSuperclass 方法,这个方法的作用是:返回表示此 Class 所表示的实体(、接口、基本类型 void)的直接超的 Type。...因为每个可以有多个。 ? 通过这样几行代码,我们就得到了。当然,这种用法很少。 现在我们知道了如何得到,那么,就将刚刚的场景中的问题解决。...(Son)的 Class,获取数组,返回第一个(因为我们只有一个类型的 Class。

    6.7K60

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

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

    9.3K21

    表达式树练习实践:C#值类型引用类型、集合、调用函数

    表达式树练习实践:C#值类型引用类型、集合、调用函数 目录 表达式树练习实践:C#值类型引用类型、集合、调用函数 一,定义变量 二,访问变量/类型属性字段和方法 1....调用函数 调用静态类型的函数 调用实例的函数 三,实例化引用类型 new 给属性赋值 创建引用类型 示例 四,实例化类型于调用 五,定义集合变量、初始化、添加元素 ?...使用上,根据实例化/不实例化,有个小区别,上面说了变量类型。 意思是,已经定义的值类型实例化的引用类型,是变量; 类型,就是指引用类型,不需要实例化的静态类型或者静态属性字段/方法。...对于引用类型来说,需要实例化。 上面的方式,是通过外界实例化传入里面的,后面会说如何在表达式内实例化。...Console.WriteLine(info); } } Test 已经是一个,表达式实例化示例 static void Main(string[] args

    1K20

    Java中如何使用引用数据类型中的呢?

    --------------------------------------- Java中数据类型的分类:   基本数据类型:48种。...byte、short、int(整数默认)、long、float、double(小数默认)、char、boolean   引用数据类型、接口、数组、字符串、Lambda等等。   ...注意:字符串、Lambda这两种引用数据类型后面会学习到。 --------------------------------------- Java中如何使用引用数据类型中的呢?...在Java 9 或者更早版本中,除了8种基本数据类型,其他数据类型都属于引用数据类型。...如果希望使用引用类型中的“”,那么典型用法的一般步骤为: 例如:使用Java中JDK已经写好的扫描器 Scanner。 步骤1:导包。     指定需要使用的目标在什么位置。

    3.3K10

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

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

    2.9K20

    【说站】Springboot如何ymlproperties配置文件中获取属性

    sunyc * @create 2022-04-24 9:43 *///将配置文件中的值映射到person中//@ConfigurationProperties 告诉springboot将本类中的所有属性与配置文件中相关的属性配置...ConfigurationProperties(prefix = "person")@Validated//数据校验public class Person {//@Email@Value("${person.name}")//properties...配置文件中获取值String name;@Value("${person.age}") //properties配置文件中获取值int age;@Value("${person.birth}")//...properties配置文件中获取值Date birth;Map map;Dog dog;List list;@Overridepublic String toString...list) {this.list = list;}} 4、@PropertySource&@ImportResource&@Bean @PropertySource:加载指定的配置文件;  使用配置的方式给

    7.9K10

    C++核心准则R.37: 不要使用破损的智能指针​获取的指针引用

    R.37: Do not pass a pointer or reference obtained from an aliased smart pointer R.37: 不要使用破损的智能指针获取的指针引用...违反本规则是引用计数丢失和发生悬空指针的第一号理由。函数更应该沿着调用链向下传递原始指针和引用。你应该在调用树的最顶端,可以保证对象存在的智能指针获得原始指针引用。...“保持引用计数”。...(简单)如果函数调用时使用了一个非局部智能指针变量(Unique_pointer or Shared_pointer)获取的指针或者引用,报警。智能指针是局部变量但是可能是别名时也报警。...如果智能指针是一个Shared_pointer,建议获取一个智能指针的局部拷贝然后该拷贝获取指针引用

    51530

    Spring中的注解与反射

    Java 中采用擦除的机制来引入,Java 中的仅仅是给编译器 javac 使用的,目的是确保数据的安全性以及免去强制类型转换的问题。...一旦编译完成,所有和相关的类型全部擦除。...在Java中可以通过反射获取信息的场景有如下三个: (1)成员变量的 (2)方法参数的 (3)方法返回值的 在Java中不可以通过反射获取信息的场景有如下两个: (1)接口声明的...(2)局部变量的获取信息,必须要注意ParameterizedType,该类中的getActualTypeArguments()方法可以有效获取信息。...= setListMethod.getGenericParameterTypes(); // 但我们实际上需要获取返回值类型中的信息,所以要进一步判断,即判断获取的返回值类型是否是参数化类型

    72010

    2022年Unity面试题分享

    属性、索引器、事件、方法 默认public,但不能写任何访问修饰符 接口是引用类型,可以通过as运算符强转,获取某对象的接口的引用 接口可以继承N个接口,继承要实现所有接口的方法 声明接口IA...,特性,动态扩容,安全 将数据(对值类型来说就是数据本身,对引用类型来说就是引用)存储在一个数组中,添加元素时若超过当前数组容量,则以2倍扩容,进而实现List大小动态可变。...链接: Dictionary实现原理资料. ---- 【重点面试题】32、是什么 多个代码对 【不同数据类型】 执行 【相同指令】的情况 :多个类型共享一组代码 允许类型参数化,类型类型的模板...5种、结构、接口、委托、方法 类型占位符 T 来表示 不是实际的,而是的模板 类型创建实例 声明类型》通过提供【真实类型】创建构造函数类型构造类型创建实例... 类型参数 性能:不会强行对值类型进行装箱和拆箱,引用类型进行向下强制类型转换,所以性能得到提高 安全:通过知道使用定义的变量的类型限制,编译器可以在一定程度上验证类型假设

    4K11

    C# 中关于

    使用值类型引用类型参数,实例化 C# 时,反射可在运行时对其进行查询,且其实际类型类型参数皆可被确定。...where T : 类型参数必须是指定的基派生自指定的基。在可为 null 的上下文中,T 必须是指定基派生的不可为 null 的引用类型。 where T : ?...无论存储数据的类型如何,添加项和集合删除项等操作的执行方式基本相同。...通过使用接口,可以在不修改代码的情况下,轻松地添加新的类型修改现有类型属性和方法。 四、方法 方法是通过类型参数声明的方法。...引用委托的代码可以指定类型参数以创建封闭式构造类型,就像实例化调用方法一样,如以下示例中所示: public delegate void Del(T item); public static

    39820

    【基本功】深入剖析Swift性能优化

    access control访问控制 private关键字修饰,使得方法属性只对当前可见。编译器会对方法进行Static dispatch。... 我们接下来会讨论属性的存储方式和方法是如何分派的。和Protocol Type的区别在于: 支持的是静态多态。 每个调用上下文只有一种类型。...y : x } 普通的展开如下,因为要支持所有类型的min方法,所以需要对类型进行计算,包括初始化地址、内存分配、生命周期管理等。除了对value的操作,还要对方法进行操作。...whole module optimization通过跨函数优化,可以进行内联等优化操作,对于,可以通过获取类型的具体实现来进行推断优化,进行类型降级方法内联,删除多余方法等操作。 ?...在此基础上,我们还介绍了功能强大的结构体的:Protocol Type和Generic。并且介绍了它们如何支持多态以及通过使用有条件限制的如何让程序更快。

    1.4K10

    第12章 元编程与注解、反射第12章 元编程与注解、反射

    第12章 元编程与注解、反射 反射(Reflection)是在运行时获取的函数(方法)、属性、父、接口、注解元数据、信息等的内部信息的机制。...Kotlin中的函数和属性也是头等公民,我们可以通过反射来内省属性和函数:如运行时属性类型,函数名类型等。 在Kotlin中我们有两种方式来实现反射的功能。...那么我们能不能通过反射获取的信息呢?我们知道 Java中的采用擦拭法。在运行时,无法得到自己本身的信息。...而当这个继承了一个父,父中有的信息,那么我们可以通过调用getGenericSuperclass()方法得到父信息。...所以,通过反射能拿到的也只能是有继承父信息的子类

    1K20

    一文打通java

    因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做。...Collection,List,ArrayList 这个就是类型参数,即 的概念 所谓,就是允许在定义、接口时通过一个标识表示中某个属性 或者是某个方法的返回值及参数类型。...的指定中不能使用基本数据类型,可以使用包装替换。 9. 在/接口上声明的,在本类本接口中即代表某种类型,可以作为非静态 属性类型、非静态方法的参数类型、非静态方法的返回值类型。...(子类或者子接口),而G是具有声明的 接口,G并不是G的子类型!...:实际案例   用户在设计的时候往往会使用的关联关系,例如,一个人中可以定义一个信息 的属性,但是一个人可能有各种各样的信息(如联系方式、基本信息等),所以此信 息属性类型就可以通过进行声明,

    16930

    Java JDK1.5: 新特性的讲解说明

    因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于 这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做。...Collection,List,ArrayList 这个就是类型参数,即的概述 所谓的,就是允许在定义,接口时通过一个标识中某个属性类型或者时某个方法的返回值以及参数类型。...> 可以理解为是List、List等各种List的父。 通配符永远不会用作方法调用,实例创建类型类型参数。...图片注意:可以用于创建,捕捉抛出参数化类型的对象 自定义异常中不可以用 图片图片不能重载每个过载的形式参数类型擦除到相同的原始类型的方法,简单的说:就是不能通过指明的的不同实现重载的...public T get(String id): map 中获取 id 对应的对象。

    94500

    【Java基础】JavaCore核心-技术

    @TOC 1.什么是 是在定义、接口和方法时,可以在声明时通过一定的格式指定其参数类型 使用时再指定具体的类型,从而使得、接口和方法可以被多种类型的数据所实例化调用 这种可以在编译时进行参数类型检查的技术被称为...E:集合中元素的类型 element K:key-value形式 key V: key-value形式 value 4.接口案例实战 (1)什么是 类型必须是引用类型,即类型(...名 对象名 = new 名(); 注意 创建的使用没有指定类型,则默认是object类型 类型逻辑上看是多个类型,实际都是相同类型 Java 可以创建对应的对象和数组引用...(); for(Field field : declaredFields){ //获取每个属性名称和类型 System.out.println...主要原因是 Java 有类型擦除,任何类型在擦除之后就变成了 Object 类型或者对应的上限类型 那定义的中如果需要用到数组,如何解决这个问题?

    36600
    领券