java之反射概述
类加载器和反射
类加载器:
1 类的加载过程:
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步骤来实现对这个类进行初始化。
加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类使用时系统都会建立一个Class对象
连接:验证,是否有正确的内部结构,并和其他类协调一致。
准备,负责为类的静态成员分配内存,并设置默认初始化值
解析,将类的二进制数据中的符号引用替换为直接引用
初始化:开辟栈、堆内存空间,创建对象、默认初始化、显示初始化、构造初始化
2 类的加载时机
1)创建类的实例
2)访问类的静态变量、或者为类的静态变量赋值
3)调用类的静态方法
4)使用反射方法来强制创建某个类或者接口对象的java.lang.Class对象
5)初始化某个类的子类:初始化子类时,首先加载其父类
6)直接使用java.exe命令来运行某个主类
3 类加载器的主要作用:
负责将.class文件加载到内存,并为之生成对应的Class对象
4 类加载器的组成
1)根类加载器:Bootstrap ClassLoader(我们使用的String等类)
也称为引导类加载器,负责java核心类的加载。比如,System Object String等,在JDK中的JRE的lib目录下rt.jar文件中
2)扩展类加载器:Extension ClassLoader
负责JRE的扩展目录中jre包的加载。在JDK中JRE的lib目录下ext目录
3)系统类加载器:System ClassLoader(加载我们自己写的)
负责在JVM启动时加载来自java命令的class文件以及classpath环境变量所指的jar包和类路径
反射:
1 反射机理
java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种
动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
即:通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法
要想解剖一个类,必须先要获取到该类的字节码文件对象。
而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class对应的Class类型的对象
2 获取Class对象的方式:必须得到class字节码文件对象,其实就是得到Class类的对象
假设该People.java打包在 com.hzw.pojo.People 。
1)通过Object类的getClass()方法
创建一个对象,通过getClass方法获取Class对象:
People p = new People();
Class people = p.getClass();//返回此 Object 的运行时类对象。
2)通过Class类的静态方法forName(),根据全类名获取Class对象
Class people = Class.forName("com.hzw.pojo.People");
3)数据类型(基本和引用)的静态属性class
Class people = People.class;
Class c = int.class; //自动装箱
Class c1 = String.class;
注意:一般,开发中使用第二种,因为第二种是一个字符串,而不是一个具体的类名。这样就可以把这样的字符串配置到配置文件中。
3 Class对象
Class类:常用类
成员变量:Field
构造方法: Constructor
成员方法:Method
反射:通过Class类的方法获取以上的三个对应的对象,然后通过Filed/Method/Contructor对象调用其方法去真正的使用类的成员、方法、构造
4 反射的使用
1)反射之构造使用:
主要方法:
Constructor<T> getContructor(Class<?>... paramTypes)
参数:parameterTypes - 参数数组 (class类型的参数)
返回值:一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor<?>[] getContructors()
返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
Constructor<T> getDeclaredContructor(Class<?>... paramTypes)
参数:parameterTypes - 参数数组
返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
Constructor<?>[] getDeclaredContructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
实例:
Class c = Class.forName("com.hzw.pojo.People"); //获取Class文件对象
Contructor con = c.getContructor();//获取它的指定构造函数对象,此处是默认构造
Object obj = con.newInstance();//通过该构造函数对象创建一个实例
System.out.println(obj);//直接打印该对象,即调用该对象实例的toString()方法
2)反射之成员使用:
主要方法:
Field getDeclaredField(String name)
参数:name - 字段名
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field getField(String name)
参数:name - 字段名
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
3)反射之成员方法:
主要方法:
Method getMethod(String name, Class<?>... parameterTypes)
返回一个 Method 对象,返回此 Class 对象所表示的类或接口的公共成员方法。
参数:name - 方法名 parameterTypes - 参数列表
Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口的公共成员方法。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
参数:name - 方法名 parameterTypes - 参数数组
返回:一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法(不分什么修饰符修饰,都可以获取到)。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
5 使用时遇到IllegalAccessException异常时,要调用setAccessible( boolean flag)方法,设置取消java语言访问检查。
public void setAccessible(boolean flag) throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
java之反射概述的更多相关文章
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...
- 面试题思考:什么是 Java 的反射机制
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- 利用Java的反射与代理机制实现AOP
在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- 如何利用缓存机制实现JAVA类反射性能提升30倍
一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...
- 【Java】反射
文章目录 反射 概述 动态语言与非动态语言 动态语言 非动态语言 Java反射机制提供的功能 反射相关的主要API 关于java.lang.Class类的理解 类的加载过程 获取Class的实例的方式 ...
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
随机推荐
- 1029: [JSOI2007]建筑抢修 贪心
https://www.lydsy.com/JudgeOnline/problem.php?id=1029 题意:n个建筑,每个有修复时间和爆炸时间,没有在爆炸时间内修复就会爆炸,问最多能修复的建筑 ...
- yii控制布局方式
1:在控制器内成员变量设置 public $layout = false; //不使用布局 public $layout = “main”; //设置使用的布局文件 2:在控制器成员方法内设置 $th ...
- css布局(转载)
单列布局 水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元素 ...
- 弄懂flex布局
目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布局以及它的好处,这里就不再赘述. 在这篇文章里,想说说flex布局的属性语法及其细节.那么网上也 ...
- 【zzuli-2276】跳一跳
题目描述 今天跳跳去公园游玩,第一个游戏就难倒了跳跳,游戏规则是跳跳站在一个面积无限大的矩形土地上,开始时跳跳在左上角(即第一行第一列),每一次跳跳都可以选择一个右下方格子,并瞬间跳过去(如从下图中的 ...
- 如何理解CMDB的套路
CMDB成功和失败,关于掌握的CMDB套路的多与少.深与浅! 前几天在对一个项目进行总结,编写CMDB的配置管理规范,发现还是有很多套路,本文就是老王总结的CMDB套路! 套路1:CMDB名字应该改一 ...
- JWT的详细简介
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场 ...
- LINUX中的DNS服务---DNS正向、反向和双向解析
一.DNS的正向解析 也就是域名解析为IP地址进行访问! 1)vim /etc/named.conf ----> 删除forwarders所在行 2)vim /etc/named.rf ...
- 表单隐藏域与display:none
有时候前端进行表单填写是分步骤的,每一步的时候其他步骤相关的表单视图不可见: 针对"不可见",以下有两种处理方式: ①display:none 这种方式呢,比较简单,就是将三个步骤 ...
- Lodash 浓缩
Lodash 是个十分有用的工具库,但我们往往只需要其中的一小部分函数.这时,整个 lodash 库就显得十分庞大,我们需要减小 lodash 的体积. cherry-pick 方法 Lodash 官 ...