Java 反射

news/2024/10/31 9:30:23/

Java 的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。

这种动态获取程序信息以及动态调用对象的功能称为 Java 语言的反射机制。反射被视为动态语言的关键。

反射的作用

  1. 在运行时判断任意一个对象所属的类。
  2. 在运行时构造任意一个类的对象。
  3. 在运行时判断任意一个类所具有的成员变量和方法。
  4. 在运行时调用任意一个对象的方法。
  5. 生成动态代理。

反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。

通过反射操作类

要想剖解一个类,必须先要获取到该类的字节码文件对象。而剖解使用的就是 Class 类中的方法。所以先要获取到每一个字节码文件对应的 Class 类型的对象。

// 获取到Person的类类型对象
// 1. 通过类获取类类型对象
Class c1 = Person.class;
// 2. 通过字符串(完整类路径)获取到类类型对象
Class c2 = Class.forName("com.dailyblue.java.reflection.Person");
// 3. 通过对象获取到当前对象的类类型对象
Person p = new Person();
Class c3 = p.getClass();
// 4. 只有8大原始类型的封装类有这个方法
Class c4 = Integer.TYPE;

三种获取类对象方式

Class 类的常见方法

通过反射操作对象

通过刚才的方式,我们获取到了类的类型对象(字节码文件对象),下来我们需要进一步通过这个类的类型对象获取到该类的实例对象。

        // 1. 获取类Class c = Class.forName("com.dailyblue.java.reflection.Person");// 2.1 获取Person类的对象Person p1 = new Person();Person p2 = new Person(1);// 2.2 通过反射获取Person类的对象// 获取到Person类的所有构造器Constructor[] constructors = c.getDeclaredConstructors();for (Constructor c1 : constructors) {System.out.println(c1);}System.out.println("----------------------------------------------------------");// 获取到具体某个构造器Class[] 形式参数列表 = {};Constructor con1 = c.getDeclaredConstructor(形式参数列表);Constructor con2 = c.getDeclaredConstructor(Integer.class);Constructor con3 = c.getDeclaredConstructor(Integer.class, String.class);System.out.println(con1);System.out.println(con2);System.out.println(con3);System.out.println("----------------------------------------------------------");// 通过构造器获取类的对象Object obj1 = con1.newInstance();Object obj2 = con2.newInstance(3);Object obj3 = con3.newInstance(4, "admin");System.out.println(obj1);System.out.println(obj2);System.out.println(obj3);

通过反射操作属性

我们已经获取到类的字节码对象,也通过字节码对象获取到该类的实例对象。下来我们来看看如何操纵类中的属性。

Field 类概述

Field 类代表某个类中的一个成员变量。 Field 完整类名为 java.lang.reflect.Field,它提供类或接口中单独字段的信息,以及对单独字段的动态访问。

Field 类的常见方法

相关代码 

        Class c = Class.forName("com.dailyblue.java.reflection.Student");Object obj = c.getDeclaredConstructor().newInstance();// 获取所有属性// 获取所有定义的属性Field[] fields1 = c.getDeclaredFields();// 获取所有拥有的public属性(包含继承下来的)Field[] fields2 = c.getFields();// 在所定义的属性中查找指定名称的属性Field f1 = c.getDeclaredField("no");Field f2 = c.getDeclaredField("schoolName");// 在所拥有的public属性中查找指定名称的属性Field f3 = c.getField("name");System.out.println("---------------------------------------");// 给属性赋值f1.setAccessible(true); // 设置私有属性可以访问f1.set(obj,1);f2.set(obj,"西北大学");System.out.println("---------------------------------------");// 获取属性的值Object v1 = f1.get(obj);Object v2 = f2.get(obj);

通过反射操作方法

Method 类的概述

Method 的方法提供了对于在类或接口中单个方法的信息和访问,反射方法可能是一个类方法或实体方法(包含抽象方法)。

Method 类的常见方法

相关代码

        // 获取类Class c = Class.forName("com.dailyblue.java.reflection.Student");// 获取对象Object obj = c.getDeclaredConstructor().newInstance();// 获取所有方法Method[] methods1 = c.getDeclaredMethods();Method[] methods2 = c.getMethods();System.out.println("---------------------------------");// 获取单个方法 第一个参数是方法名,其后参数是形式参数列表Method m1 = c.getDeclaredMethod("e", String.class);Method m2 = c.getDeclaredMethod("f");Method m3 = c.getMethod("d", Integer.TYPE, String.class);System.out.println("---------------------------------");// 操作方法 第一个参数是对象,其后参数是实际参数列表Object result1 = m1.invoke(obj, "admin");m2.setAccessible(true);Object result2 = m2.invoke(obj);Object result3 = m3.invoke(obj, 1, "张三");
invoke方法:作用:调用包装在当前Method对象中的方法。
原型:Object invoke(Object obj,Object...args) 
参数解释:obj:实例化后的对象;args:用于方法调用的参数
返回:根据obj和args调用的方法的返回值
抛出错误:IllegalAccessException(Method对象强制Java语言执行控制或无权访问obj对象) IllegalArgumentException(方法是实例化方法,而指定需要调用的对象并不是实例化后的类或接口)


http://www.ppmy.cn/news/279626.html

相关文章

java设计模式-UML统一建模语言

2 UML统一建模语言 idea插件PlantUML; UML类图 描述类本身的组成和类之间的各种静态关系; 类之间的关系 依赖:在类中用到了对方;泛化:实际就是继承,依赖关系的特例;实现:类实现…

逆袭:2012互联网盘点

原文地址:http://www.somechinese.com/524.html 本文作者:张亚辉 2011年,谷歌收购摩托罗拉、乔布斯辞世,移动互联网领域风云激荡。与此同时,雷军成功偷师魅族,推出小米手机,配以期货模式的粉丝营…

移动级处理芯片岁末盘点

时间过得真快,不知不觉间又到了年关,这就说明一年一度做盘点汇总的时候也要到了。作为即将踏入这个科技行业快有三个年头的媒体人,笔者也这在这段时间内跟随新兴的移动互联网市场一起成长着,同时也看尽了这三年来行业里无情的变迁…

【年终策划】逆袭:盘点2012互联网

注:这篇文章是瘦米中文网的朱景找我写的,临考前花四天时间外加一盒万宝路拼凑出这么一篇文章,留个纪念。感谢朱景,感谢药师! 【年终策划】逆袭:盘点2012互联网 在刚刚结束的2012年CCTV年度经济人物评选活动…

瘦死的骆驼比马大,唱衰苹果您且慢

几乎每次苹果推出新产品,业界都会“口诛笔伐”好一阵子,有人说苹果雄风不再,也有人说苹果越发平庸,总之,今天的苹果似乎是“虎落平阳被犬欺”,和苹果有利益冲突,或者没有利益冲突的,…

嵌入式操作系统风云录:历史演进与物联网未来.

嵌入式操作系统风云录: 历史演进与物联网未来 何小庆 著 图书在版编目(CIP)数据 嵌入式操作系统风云录:历史演进与物联网未来 / 何小庆著. —北京:机械工业出版社,2016.10 ISBN 978-7-111-55085-3 Ⅰ. 嵌… Ⅱ. 何… Ⅲ. 实时操作系统 Ⅳ. TP316.2 中国版本图书馆…

从Intel和ARM争霸战,看看做芯片有多难

原文链接:https://www.jianshu.com/p/1ac347d0420b 从Intel和ARM争霸战,看看做芯片有多难 这几天中兴事件持续发酵以来,各种议论纷纷扰扰。但我触动最大的,还是碧树西风写的这句话:“ 一碗牛肉面,真的要…

中国智能手机步入零增长时代,为何一半国产手机巨头选择为高通站台

25日 高通在北京召开2018高通中国技术与合作峰会,宣布5G领航计划。联想、OPPO、vivo、小米、中兴、闻泰科技在峰会上表示将开启合作,共同加速商用顶级5G终端在2019年的推出。 媒体对此评价为“中国手机半壁江山为高通站台”。这样一幕“武林大会”式样的…