前言
每天一小步,进步一大步。java反射机制深入理解剖析
0x01 背景
在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力,通过反射可以调用私有方法和私有属性,大部分框架也都是运用反射原理的。java通常是先有类再有对象,有对象就可以调用方法或者属性,java中的反射其实是通过Class对象来调用类里面的方法。
0x02 发射简介:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
一个类有多个组成部分,例如:成员变量、方法、构造方法等,反射就是加载类,并解剖出类的各个组成部分。
反射机制主要提供以下功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
0x03 java中的反射及作用:
假如有两个程序员,一个程序员在写程序的时需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码是不能通过编译的。此时,利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。如eclipse中,一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。
0x04 反射机制中有哪些类:
1 | java.lang.Class; |
0x05 反射机制的相关API
通过一个对象获得完整的包名和类名:
1 | package com.example.demo; |
结果如下:
1 | com.example.demo.Test8 |
实例化Class类对象
1 | package com.example.demo; |
结果如下:
1 | 类名称 com.example.demo.Test8 |
获取一个对象的父类与实现的接口
1 | package com.example.demo; |
结果如下:
1 | clazz的父类为:java.lang.Object |
通过反射机制实例化一个类对象
1 | package com.example.demo; |
结果如下:
1 | User [age=20, name=liyu] |
获取某个类的全部属性
1 | package com.example.demo; |
结果如下:
1 | ===============本类属性=============== |
获取某个类的全部方法
1 | package com.example.demo; |
结果如下:
1 | public static void main ([Ljava.lang.String; arg0) throws java.lang.Exception |
通过反射机制调用某个类的方法
1 | package com.example.demo; |
通过反射机制操作某个类的属性
1 | package com.example.demo; |
结果如下:
1 | calc |
反射机制的动态代理
1 | package com.example.demo; |
结果如下:
1 | liyu 20 |
0x06 反射机制的应用实例
在泛型为Integer的ArrayList中存放一个String类型的对象
1 | package com.example.demo; |
结果如下:
1 | java反射机制实例。 |
通过反射取得并修改数组的信息
1 | package com.example.demo; |
结果如下:
1 | 数组类型: int |
通过反射机制修改数组的大小
1 | package com.example.demo; |
结果如下:
1 | 数组长度为: 15 |
将反射机制应用于工程模式
1 | package com.example.demo; |
结果如下:
1 | Apple |