文章目录

  • 反射:
  • 一、class详解
  • 1.Class.forName()
  • 2.class.class或者object.getClass
  • 3.包装类型
  • 4.获取父类,Object是所有类的父类
  • 5.通过反射把泛型处理掉
  • 二、constructor详解
  • 1.使用反射来获取构造器(getConstructor/getConstructors)
  • 2.使用指定的构造器实例化对象(newInstance)
  • 三、method详解
  • 1.如何获取到执行的Method(getDeclaredMethod)
  • 2.如何动态调用Method(invoke)
  • 四、field详解
  • 1.如何获取到属性(Field)
  • 2.类里面的私有属性能不能设置值?(面试题)
  • 五、beanutils详解
  • 1.简单使用
  • 2.更快的方式
  • 六、introspector详解
  • 1.获取
  • 2.调用

反射:
  • Java反射机制是在运行状态中(运行的时候可以通过反射机制提供的一些技术为我们做一些事情,这些事情对于框架来说是非常重要的)
  • 对于任何一个类,都能知道该类的所有属性和方法(在运行状态下,一个类通过反射机制能够知道该类中有哪些属性和方法)
  • 对于任何一个对象,都能调用它的任意一个方法和属性(new出来的对象调用里面的方法和属性这一部分是非常非常核心和重要的)
  • 动态获取信息以及动态调用对象方法的功能称为Java反射机制(反射是核心当中的核心,比如你想要了解一个类,首先你要获取这个类的字节码文件,它里面有对应的class类型的对象,然后我们用class这个对象做相应的功能)

反射中涉及到的API主要有Class、Constructor(构造器)、Method(方法)、Field(成员变量)

思考:在java中通过构造方法可以new一个对象,那在Scala中创建一个对象一定需要new吗?如果不用new那它应该使用一种什么方式搞定呢?

一、class详解

创建maven项目,我们用单元测试,在pom.xml文件中添加

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

如何获取Class对象:

1.Class.forName()

java 返回的实体映射成年月日时分秒_java 返回的实体映射成年月日时分秒


java 返回的实体映射成年月日时分秒_反射_02

注:Object里面所有的方法务必要掌握,面试的时候特别是阿里系或者顶级的大公司Object这个类会面试很久的,比如equals和hashCode有没有关系等问题。getDeclaredMethods和getMethods的区别:

java 返回的实体映射成年月日时分秒_父类_03

2.class.class或者object.getClass

java 返回的实体映射成年月日时分秒_java 返回的实体映射成年月日时分秒_04

3.包装类型

java 返回的实体映射成年月日时分秒_父类_05

4.获取父类,Object是所有类的父类

java 返回的实体映射成年月日时分秒_java_06

5.通过反射把泛型处理掉

java 返回的实体映射成年月日时分秒_反射_07

二、constructor详解
1.使用反射来获取构造器(getConstructor/getConstructors)

java 返回的实体映射成年月日时分秒_反射_08

2.使用指定的构造器实例化对象(newInstance)

java 返回的实体映射成年月日时分秒_java 返回的实体映射成年月日时分秒_09

三、method详解
1.如何获取到执行的Method(getDeclaredMethod)

java 返回的实体映射成年月日时分秒_java_10

2.如何动态调用Method(invoke)

java 返回的实体映射成年月日时分秒_java_11

四、field详解
1.如何获取到属性(Field)

java 返回的实体映射成年月日时分秒_构造器_12

2.类里面的私有属性能不能设置值?(面试题)

肯定是可以的,必定要通过一个反射的机制来完成

java 返回的实体映射成年月日时分秒_反射_13

解決:通过反射获得私有属性

java 返回的实体映射成年月日时分秒_父类_14

五、beanutils详解

前面我们讲的使用反射的一些基本api的用法,工作中还用到一些比较有用的框架,比如BeanUtils,添加配置:

<dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>
1.简单使用

java 返回的实体映射成年月日时分秒_java_15

2.更快的方式

java 返回的实体映射成年月日时分秒_java_16

六、introspector详解
1.获取

java 返回的实体映射成年月日时分秒_构造器_17

2.调用

java 返回的实体映射成年月日时分秒_构造器_18