反射是什么?反射的常用方法
反射
概念
反射指的是程序可以访问、检测和修改它本身状态或行为的一种能力。反射可以将类的各个组成部分分装为其他对象。
理解
框架
框架是半成品的软件,可以在框架的基础上进行软件开发,简化编码,而反射是框架的灵魂。
Java在计算机中经历的阶段:三个阶段
- source源代码阶段
- class类对象阶段
- 运行时阶段
class类:class类对象由成员变量(Field)、成员方法(Method)和构造方法(Constructor)等部分构成
获取class类对象方式
- class.forName(“全类名”):将字节码文件加载进内存,返回class对象。全类名要包括包名、类名。
- 该方法多用于配置文件,将类名定义在配置文件中,读取文件,加载类,框架中常用的方式。
- 通过类名.class( )方式来获取对象,这时文件已经加载到内存中了
- 多用于参数的传递
- 对象名.getClass方法:getClass方法在object类中定义。
- 多用于对象的获取字节码的方式。
- 重点:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取class类对象都是同一个。但获取其他方法对象、变量对象则不是同一个。
- class.forName(“全类名”):将字节码文件加载进内存,返回class对象。全类名要包括包名、类名。
class对象功能:
获取成员变量们
/*获取class类对象的三种方式*/Class cls = Class.forName("com.huiyan.bohui.test.Person");System.out.println(Person.class);Person person = new Person();System.out.println(person.getClass());/*只获取public修饰的成员变量*/Field[] fields = cls.getFields();for (Field fields1:fields) {/*获取成员变量的值*/Object value =fields1.get(person);System.out.println(value);}/*只获取特定名字的public修饰的成员变量,如果获取的不是public修饰的成员变量,会报错,表示不存在该成员变量*/Field fld = cls.getField("gender");/*修改成员变量的值*/fld.set(person,"女");/*获取全部的成员变量*/Field[] fields1 = cls.getDeclaredFields();/*修改成员变量私有变量的修改需要设置一个值* 为了忽略访问权限修饰符的安全检查。需要对象调用这个 getAccessible(true),就可以访问private修饰的对象了。下面这个是private修饰的成员变量。如果不设置getAccessible的值为true,则会报错。报错信息如下Exception in thread "main" java.lang.IllegalAccessException: Class com.huiyan.bohui.reflect.Reflect1 can not access a member of class com.huiyan.bohui.test.Person with modifiers "private"* */Field fieldDeclare1 = cls.getDeclaredField("name");fieldDeclare1.setAccessible(true);Object valueDeclare1 = fieldDeclare1.get(person);System.out.println(valueDeclare1);
获取构造方法们
构造方法有一个创建对象的方法 constructor.newInstance(); 如果是使用空参构造器创建对象,直接使用class类对象的new instance方法。 类对象.newInstance():获取到了类对象。 获取私有构造器也可以使用暴力反射,设置setAccessible为true。
获取成员方法们和获取类名
Object invoke(Object obj, Object... args) 方法 /*获取指定名称的方法对象*/ Person p = new Person(); Method method = cls.getMethod("eat"); Method method1 = cls.getMethod("eat",String.class); /*执行方法*/ method.invoke(p); method1.invoke(p,"饭");/*获取方法名或者全类名*/ String name = method.getName(); String className = personClass.getName;
案例:写一个“框架”,可以帮我们创建任意类的对象,并且执行其中任意方法。
public class ReflectTest {/*这个是框架,可以帮我们创建任意类的对象,并操作类的方法。 * 1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中2.在程序中加载读取配置文件3.使用反射技术来加载类文件进内场4.创建对象5.操作对象* */public static void main(String[] args) throws Exception {//加载配置文件,创建properties对象Properties pro = new Properties();/*加载配置文件,转换为一个集合,先获取类加载器,使用类加载器获取class目录下的配置文件字节流,然后使用properties对象的load方法加载*/ClassLoader classLoader = ReflectTest.class.getClassLoader();InputStream is =classLoader.getResourceAsStream("pro.properties");pro.load(is);//获取配置文件中定义的数据String className = pro.getProperty("className");String methodName = pro.getProperty("methodName");//加载该类进内存Class cls = Class.forName(className);//创建对象Object obj = cls.newInstance();//获取和操作方法Method method1 = cls.getMethod(methodName);/*invoke方法返回值为null*/method1.invoke(obj);} }
总结
1.获取类对象的三种方法
(1)class.forname(“全类名”)
(2)类名.class();
(3)对象名.getClass();
2.获取一个类的对象的方法
(1)new关键字直接创建
(2)获取类对象,使用newInstance()方法。
(3)通过clone方法创建一个对象。
(4)通过反序列化的方式创建一个对象。
3.获取类的Field/Method/Constructor对象
(1)有四种常用方法:getField/getField("")/getDeclaredField()/getDeclardField()
后面的method和constructor对象的获取方法类似。
前两种方法获取public修饰的成员变量/成员方法/构造器,后两种可以获取任意的成员变量/成员方法/构造器。后两种访问私有变量/成员方法/构造器时都要设置setAccessble为true,采用暴力的方式让系统忽略访问权限修饰符的安全检查。获取或设置变量用get方法和set方法,执行Method方法用invork(),还可以传参数。获取构造方法后可以用来创建类的对象。
4.获取方法名和全类名的方法:getClass()
反射是什么?反射的常用方法相关推荐
- 一篇文章弄懂Java反射基础和反射的应用场景
文章目录 一.Java反射定义 二.Java反射机制实现 1.Class对象获取 2.获取class对象的摘要信息 3.获取class对象的属性.方法.构造函数等 三.反射的应用场景 1.动态代理 2 ...
- Java 反射 (快速了解反射)
反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...
- java 反射代价_Java反射机制
# 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
文章目录 一.报错信息 二.解决方案 一.报错信息 在执行反射方法时 , 反射方法后 , 直接调用该方法 ; // 获取 View 的 getListenerInfo 方法 Method getLis ...
- Java 反射机制[Field反射]
Java 反射机制[Field反射] 1. 反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...
- java反射模式_Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...
- java 反射 速度_Java 反射获取类方法速率和实现方式
今天突然想到Java反射.然后测试了一下1.8.0_191版本的反射性能,没想到反射竟然比直接调用性能还高. 反射介绍 Java反射是指在程序运行状态中,能检查任意对象的内容并调用任意方法.对于任何一 ...
- java反射方法_java反射之方法反射的基本操作方法
本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...
最新文章
- 收藏版超全机器学习资料合集
- shell-sed命令详解(转)
- 用Silverlight做广告Banner
- ros轮式小车学习链接
- redis源码剖析(八)—— 当你启动Redis的时候,Redis做了什么
- 初学者python笔记(装饰器后篇:登陆验证)
- pthread_join来接收线程的返回参数
- 谭晓生大闹中国计算机中心,360高管谭晓生不满中国计算机大会拖堂和临时加议程,现场摔话筒发飙...
- 【BAT】中文数字to阿拉伯数字转换
- iOS 使用ZipArchive压缩文件
- web 服务器有哪些
- 利用red5搭建一个简单的流媒体直播系统(ubuntu 12.10)
- win10小娜助手无法搜索本地应用怎么办
- TCP协议和UDP协议头部结构
- 【前端微服务化】使用飞冰搭建前端微服务化框架
- spyder pyecharts不显示_逆袭的IGZO-IPS小金刚!微星PAG272QRZ显示器评测:色域、响应速度更优秀...
- Fragment中getContext得到的context从哪来?
- 图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析
- 解决“此图片来自微信公众平台 未经允许不可引用”的方法
- 我的理想计算机作文300字,我的理想作文300字(通用5篇)
热门文章
- 基于lucene的案例开发:纵横小说数据库操作
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
- 冷酷小叶的Java学习笔记Day6
- MySQL完全卸载,mysql服务清理
- 下载最新的Windows10官方系统镜像
- 创业板“市盈率” PE ratio
- 手把手系列--验证自己编写的STM32H750XBH6_ArtPi平台Keil MDK Flash下载算法
- 兄弟连IT教育-九年的发展!
- 织梦友情链接加nofollow方法,亲测
- newmultipartentity php,使用MultipartEntity图片上传