java的特性--反射

甘瑰
• 阅读 1435

前言

说起发射,先说正射是什么,我们代码中通过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();

获取属性

  • 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);
        }
    }

注解获取类

点赞
收藏
评论区
推荐文章
待兔 待兔
4年前
一篇文章弄懂 Java 反射的使用
说到Java反射,必须先把Java的字节码搞明白了,也就是Class,大Class在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息,还不太明白Java的大Class的,可以先看一下之前的文章先想一个问题1.给我们一个类,我们如何使用?这还不简单,通过这个类,创建一个类的对象,再通过这个
Wesley13 Wesley13
4年前
java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act
Wesley13 Wesley13
4年前
java反射大全
作者对反射的理解:方法的调用(正常的调用:对象.方法()。反射调用方法:方法.对象())静态属性的调用(正常的调用:类.属性。反射调用:属性.类)常见反射的用法:        1.通过反射获取类Class<?demo1Class
二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?
二面京东被问到Java反射,我直呼好家伙,这我不是必过吗?用多久我会升职加薪、当上技术总监、迎娶漂亮学姐、走上人生巅峰!想想还有点小激动。好了开始分享面试经历说说你反射的理解到底什么是反射呢???反射的核心就是JVM在运行时才动态加载类或调用方法,访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。每一个类都会产生一个对应的Class对象,
浪人 浪人
4年前
Java基础与提高干货系列——Java反射机制
前言今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文Java反射机制定义Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以
lzy lzy
4年前
RPC框架手撕之路---java反射以及动态代理机制
在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法
Wesley13 Wesley13
4年前
Java基础之反射(非常重要)
反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法
Wesley13 Wesley13
4年前
Java重点基础:反射机制
一、什么是反射?Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。二、反射的三种方式
Wesley13 Wesley13
4年前
Java反射机制详解
一、内容提要:  1、反射机制是什么  2、反射机制能做什么  3、反射机制相关的API  4、通过一个对象获得完整的包名和类名  5、实例化Class类对象  6、获取一个对象的父类与实现的接口  7、获取某个类的全部构造函数  8、通过反射机制实例化一个类的对象  9、获取某个类的全部属性  10、
Wesley13 Wesley13
4年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢
Wesley13 Wesley13
4年前
Java高级特性—反射和动态代理
1).反射  通过反射的方式可以获取class对象中的属性、方法、构造函数等,一下是实例:2).动态代理  使用场景:      在之前的代码调用阶段,我们用action调用service的方法实现业务即可。    由于之前在service中实现的业务可能不能够满足当先客户的要求,需要我们重新修改servic