【java基础】从反射开始(Reflection)
Java学习笔记 https://github.com/SnailDev/java-learning 和我一起启程...
反射(Reflection)
- 定义
在运行状态中, 对于任意的一个类,都能够知道这个类的所有属性和方法; 对于任意的一个对象,都能够调用他的任意一个方法和属性; 这种动态获取类的信息以及动态调用对象的方法的功能称做Java的反射机制。
- 功能
- 只要给定类的全名,即可获取类的所用信息;
- 运行时获取任意一个对象所属的类对象;
- 运行时获取类中所有属性对象,可对其操作(包含私有属性);
- 运行时获取类中、父类中所有方法,可对其调用。
- 应用
目前主流的应用框架如Struts2、Hibernate、Spring、SpringMVC等的核心全部都是利用Java的反射机制来实现的。
- 组成
- Class
- Constructor
- Field
- Method
类的类型(Class)
- 常用方法
- getName() 获得类中完整名称
- getDeclaredFields() 获取类中所有属性(含私有)
- getDeclaredMethods() 获取类中所有方法(含私有)
- getConstructors() 获取类的构造方法(不含私有)
- newInstance() 实例化类的对象(类的构造方法中参数需为空)
- 获取Class对象的方式
- 利用Class类forName()静态方法传入一个类的全路径来返回相对应的Class对象;
- 将实例化的类对象转成Object对象,再通过Object对象的getClass()方法来返回对应类的Class对象;
- 通过类的class属性来返回类的Class对象。
即
- Class.forName("要加载的类名")
- 对象名.getClass()
- 类名.class
- 反射的大致流程
- 用上述三种方式之一获取特定类的Class类,即该类对应的字节码
- 调用Class对象的getConstructor(Class<?>... parameterTypes)获取构造方法对象
- 调用是构造方法类Constructor的newInstance(Object... initargs)方法新建对象
- 调用Class对象的getMethod(String name, Class<?>... parameterTypes)获取方法对象(用方法的参数类型唯一标识一个方法,依据:方法的重载)
- 调用方法对象类Method的invoke(Object obj, Object... args)方法,调用对象上相应方法
类的构造方法(Constructor)
类的构造函数反射类,通过getConstructors()方法可以获得类的所有构造函数反射对象数组。其中最主要的一个方法就是newInstance(),通过该方法可以创建一个对象类的实例,相当于new关键字。
类、接口的属性对象(Field)
- 常用方法
- getName() 获取属性名称
- getType() 获取属性类型
- get(Object obj) 获取obj对象中这个属性的值
- set(Object obj, Object value) 向obj对象中这个属性赋值value
- setAccessible(boolean flag) 启用/禁用访问控制权限
- Class对象中获取Field对象
- Field[] getDeclareFields() 获取类中所有的属性信息(含私有)
- Field[] getFields() 获取类中所有的公共属性信息(即不含私有)
类、接口的方法对象(Method)
- 常用方法
- getName() 获取方法名称
- getReturnType() 获取方法返回类型
- invoke(Object obj,Obeject... args) 利用obj对象调用该方法
- getParameterTypes() 获取方法所有参数类型,按照顺序返回Class数组
- getDeclaredAnnotations() 获取方法的所有注解
- Class对象中获取Method对象
- Method[] getDeclareMethods() 获取类中所有的方法信息(含私有);
- Method[] getMethod(String name, Class<?>... paramterTypes) 获取某个特定的方法,第一个参数为方法名称,第二个参数为方法参数的类对象(当方法具有多个参数时,传入的是Class数组;当方法参数为0个时,传入null);
其他实践
数组的反射
- 对于元素同类型的数组,同维数组,class一样
- 不同维的,class不同
- 不同维的,父类都是Object,一样
- 基本类型一维数组不能直接转换为Object[]
- java.util.Arrays的 asList 方法留意下
hashCode 与内存泄漏问题
- hashCode 一旦生成,不要变
- 对象equals()方法返回true,则hashCode()返回要保持一致
- 反之,equals()方法返回false, 则hashCode()不一定返回false
内省(Introspector) & JavaBean
JavaBean-是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。
JavaBean的分类
- 侠义的JavaBean
- 私有的字段(Field)
- 对私有字段提供存取方法(读写方法)
- 广义的JavaBean
- 私有的字段(Field)
- 对私有字段提供存取方法(读写方法)
- 数量任意的业务方法
内省(IntroSpector)是Java语言对JavaBean 类属性、事件的一种处理方法。
JavaBean读取属性x的值的流程:变大写、补前缀、获取方法。
"x"-->"X"-->"getX"-->"MethodGetX"
- 简单实现 使用java.beans.PropertyDescriptor类
- 复杂实现 使用java.beans.Introspector类,遍历getBeanInfo方法的返回值
- 使用BeanUtils工具包
- 字符串和整数转换(对比(PropertyUtils)
- 属性级联操作
- 操作map
- 侠义的JavaBean
Java学习笔记 https://github.com/SnailDev/java-learning 和我一起启程...
【java基础】从反射开始(Reflection)的更多相关文章
- 黑马程序员:Java基础总结----反射
黑马程序员:Java基础总结 反射 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...
- 黑马程序员——JAVA基础之反射
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java 反射是Java语言的一个很重要的特征,它使得Java具体了"动态 ...
- java基础(十一 )-----反射——Java高级开发必须懂的
本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...
- Java基础之一反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- Java基础之—反射
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...
- 【Java基础】反射和注解
前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...
- JAVA基础知识|反射
一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为ja ...
- 【Java基础】反射
反射 反射的概述 反射(Reflection)是被视为动态语言的关键,反射机制允许程序在执行期借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性和方法. 加载完类 ...
- Java基础之反射总结
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- java基础之反射机制
一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...
随机推荐
- python 带参与不带参装饰器的使用与流程分析/什么是装饰器/装饰器使用注意事项
一.什么是装饰器 装饰器是用来给函数动态的添加功能的一种技术,属于一种语法糖.通俗一点讲就是:在不会影响原有函数的功能基础上,在原有函数的执行过程中额外的添加上另外一段处理逻辑 二.装饰器功能实现的技 ...
- node 无脑生成小程序二维码图
RT 新建createwxaqrcode.js: const request = require('request') const fs = require('fs') // eg:生成购物车列表圆形 ...
- D08——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D08 20180829内容纲要: socket网络编程 1 socket基础概念 2 socketserver 3 socket实现简单的SSH服务器端和 ...
- 剑指offer四十九之把字符串转换成整数
一.题目 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 二.思路 详见代码. 三.代码 public class Solution { ...
- CentOS 安装Scrapy
本文python版本是python3.5.3,关于升级python和安装pip请到:http://www.cnblogs.com/technologylife/p/6242115.html 安装相关包 ...
- (转)Python 字符串
原文:http://www.runoob.com/python/python-strings.html
- Flume搭建及学习(基础篇)
转载请注明原文出处:http://www.cnblogs.com/lighten/p/6830439.html 1.简介 该文主要是翻译官方的相关文档,源地址点击这里.介绍一下Flume的一些基本知识 ...
- Spring Security构建Rest服务-1204-Spring Security OAuth开发APP认证框架之Token处理
token处理之一基本参数配置 处理token时间.存储策略,客户端配置等 以前的都是spring security oauth默认的token生成策略,token默认在org.springframe ...
- inline-block各浏览器兼容以及水平间隙问题解决方案
inline-block属性 This value causes an element to generate a block box, which itself is flowed as a sin ...
- Android4.0 Launcher拖拽原理分析
在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的. 1) 先来看看类之间的继承关系 2)再来看看Launcher拖拽流程的时序图 1.基本流程: ...