反射

作者: 啦啦啦_9a5f | 来源:发表于2019-01-03 14:19 被阅读0次

一、反射概述

(一)反射就是在运行时通过代码操作类。

想要操作类,就必须先获得该类的字节码对象.Class。通过Class提供的方法对类进行进一步的解剖,从而实现各种操作。

(二)类各个组成的专业描述

Class类

Constructor 构造

Method 方法

Field 字段

instance 实例

invoke 执行

(三)JavaBean用于反射操作

Javabean规范

1.提供私有字段

2.提供get或set方法,可以使用快捷键生成

3.提供无参构造方法

4.必须要实现序列化接口 Java.io.Serializable

二、java 提供三种方式来获得Class,

不同的应用场景,需要不同的方式获得Class对象

(一)方式:

1.通过字符串(全限定类名)获得

格式:Class clazz = Class.forName("字符串");

全限定类名:包名+类名

2.通过Java类型获得

格式:Class clazz = 类型.class;

3.通过实例对象获得

格式:Class clazz  = obj.getClass();

(二)应用场景:

方式1:之后开发中,从配置文件中,获得“全限定类名”,并通过反射进行所有操作

方式2:确定构造方法、普通方法形参列表时,需要通过类型获得

方式3:方法内部通过变量名获得

三、反射获得实例化对象

(一)通过无参构造方法获得实例对象

1.获得Class对象

Class clazz = Class.forName("全限定类名");

2.通过clazz获得无参构造,相当于:Bean()

//getConstructor()获得指定形参列表的构造方法

Constructor cons = clazz.getConstructor();//返回无参构造函数

3.通过构造对象获得实例化对象,相当于:new Bean()

//newInstance()创建指定实参的实例对象

Object obj = cons.newInstance();

(二)有参构造

1.获得Class对象

Class clazz = Class.forName("reflect_bean.Bean");

 2.通过clazz获得无参构造,相当于:Bean()

//getConstructor()获得指定形参列表的构造方法

Constructor cons = clazz.getConstructor(String.class);//返回无参构造函数

  3.通过构造对象获得实例化对象,相当于:new Bean()

//newInstance()创建指定实参的实例对象

Object obj = cons.newInstance("b002");

System.out.println(obj);

(三)无参构造的简写方式

1.获得Class对象

Class clazz = Class.forName("reflect_bean.Bean");

/2.通过clazz直接创建对象

Object object = clazz.newInstance();

(四)私有反射(暴力反射)

1.获得Class对象

Class clazz = Class.forName("reflect_bean.Bean");

  2.获得指定形参私有构造

// clazz.getConstructor(...):获得指定对象指定的public构造方法

// clazz.getDeclaredConstructor(...):获得指定对象指定的任意构造方法,包含私有构造

Constructor constructor = clazz.getDeclaredConstructor(String.class,String.class);

3.通知JVM,运行实例私有构造(默认不允许)

constructor.setAccessible(true);

  4.创建实例化,并设置实际参数

Object object = constructor.newInstance("b001","名称");

System.out.println(object);

三、反射普通方法

(一)public方法

1.获得实例

Class clazz = Class.forName("reflect_bean.Bean");

        Object object = clazz.newInstance();

// 2.通过setId方法,设置数据

// 2.1获得方法,需要明确形参列表,setId

Method method = clazz.getMethod("setId", String.class);

// 2.2执行方法,bean。setId(...)

//   确定实例对象,并执行正确方法,具体实际参数

        method.invoke(object,"b002");

// 3.通过getId方法,获得数据

Method getMethod = clazz.getMethod("getId");

String s = (String) getMethod.invoke(object);

System.out.println(s);

(二)private方法

// 1.获得实例

Class clazz = Class.forName("reflect_bean.Bean");

        Object object = clazz.newInstance();

// 2.通过setId方法,设置数据

// 2.1获得方法,需要明确形参列表,setId

//        clazz.getMethod(name,...):只能获得public方法

//        clazz.getDeclaredMethod(name,...):获得已声明的所有方法

        Method method = clazz.getDeclaredMethod("setId", String.class);

//      2.2强制设置运行访问私有访问(暴力)

        method.setAccessible(true);

// 2.3执行方法,bean。setId(...)

//   确定实例对象,并执行正确方法,具体实际参数

        method.invoke(object,"b002");

// 3.通过getId方法,获得数据

Method getMethod = clazz.getMethod("getId");

String s = (String) getMethod.invoke(object);

System.out.println(s);

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

      本文标题:反射

      本文链接:https://www.haomeiwen.com/subject/ruyfrqtx.html