java的新特性反射机制应用及操作示例详解

 更新时间:2023年05月22日 08:43:58   作者:avatar 小强Zzz  
这篇文章主要为大家介绍了java的新特性反射机制的操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

说起发射,先说正射是什么,我们代码中通过User user = new User();代码创建一个对象,并调用User类的成员变量或方法,这种我们通过Class信息获取class实例,称之为正射,这种代码编译器编译时便知道他会生成一个user对象。

如果我们在写代码时不知道我们要操作的对象类型,他可能是User类型,也可能是House类型,而User类型和Clazz类型有没有继承关系,只知道要调用他的getId()方法,那又该怎么调用对象的方法呢?

反射

对于反射而言,我们获得了一个对象的实例,并且知道了这个对象的类型,那么我们便可以对他进行一切操作。

这是由于JVM为每一个加载的class都创建了一个class实例,并保存了实例的所有信息,包括类型,父类,方法,属性等等,这使得我们可以获取class实例的所有信息。
这种通过class实例获取class信息的方法称为反射

获取class又3种方法

通过一个class的静态变量class获取

Class clazz = User.class;

通过完整包路径获取

Class clazz = Class.forName("xiaoqiangZzz.busticket;");

通过实例获取

Object object = getObject();
Class clazz = object.getClass();

获取到class后,我们也可以通过class创建实例对象

Object object = clazz.newInstance();
Object object = clazz.newInstance();

获取属性

  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
public void getId(Object object) throws IllegalAccessException {
    Class clazz = object.getClass();
    Field field = clazz.getField("age");
    field.setAccessible(true);
    System.out.println(field.get(object));
    field.setAccessible(false);
}

类似的,我们可以获取方法并调用

  • Method getMethod(name, Class...):获取某个public的Method(包括父类)
  • Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
  • Method[] getMethods():获取所有public的Method(包括父类)
  • Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)
public void getMethod(Object object) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    Class clazz = object.getClass();
    Method method = clazz.getMethod("getId");
    method.invoke(object);
}

反射应用

制作一个通用的数据库表导出方法

public void wirte(Object[] objects, Class classN) throws IllegalAccessException {
        Sheet sheet = new Sheet();
        Field[] fields = classN.getDeclaredFields();
        for (int i = 1; i < objects.length; i++) {
            Row row = sheet.createRow(i);
            for (Field field : fields) {
                field.setAccessible(true);
                // 写入单元格
                ...........
                field.setAccessible(false);
        }
    }

注解获取类

以上就是java的新特性--反射的详细内容,更多关于java的新特性--反射的资料请关注脚本之家其它相关文章!

相关文章

  • Java 断言 assert的用法详解

    Java 断言 assert的用法详解

    Java assert断言机制是Java5中推出的新特性,它主要用于在程序运行时检查状态或假设的正确性,本篇文章将全面详细地讲解Java assert断言机制,包括断言概述、语法规则、工作原理、使用场景、注意事项以及示例代码等方面,需要的朋友可以参考下
    2023-05-05
  • Java如何实现将类文件打包为jar包

    Java如何实现将类文件打包为jar包

    这篇文章主要介绍了Java如何实现将类文件打包为jar包,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring MVC--拦截器实现和用户登陆例子

    Spring MVC--拦截器实现和用户登陆例子

    本文主要介绍了Spring MVC--拦截器实现和用户登陆例子,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • Java中线程死亡的几种情况实例分析

    Java中线程死亡的几种情况实例分析

    线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。下面这篇文章主要给大家介绍了Java线程死亡的几种情况,需要的朋友可以参考下。
    2017-01-01
  • Springboot MongoDB实现自增序列的项目实践

    Springboot MongoDB实现自增序列的项目实践

    在某些特定的业务场景下,会需要使用自增的序列来维护数据,本文主要介绍了Springboot MongoDB实现自增序列的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java多线程通信问题深入了解

    Java多线程通信问题深入了解

    下面小编就为大家带来一篇深入理解JAVA多线程之线程间的通信方式。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-07-07
  • Java 策略模式 if-else用法实例详解

    Java 策略模式 if-else用法实例详解

    这篇文章主要介绍了Java 策略模式 if-else用法详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • SpringBoot错误提示400状态问题

    SpringBoot错误提示400状态问题

    这篇文章主要介绍了SpringBoot错误提示400状态问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java HashMap详解及实例代码

    java HashMap详解及实例代码

    这篇文章主要介绍了java HashMap详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java快速排序的实现详细代码及通俗解释

    Java快速排序的实现详细代码及通俗解释

    这篇文章主要介绍了Java快速排序实现的相关资料,快速排序是一种高效的排序算法,通过选择一个基准值将数组分成两部分,左边的元素比基准值小,右边的元素比基准值大,然后递归地对这两部分进行排序,需要的朋友可以参考下
    2025-02-02

最新评论