java-反射详解
2022/1/11 17:06:06
本文主要是介绍java-反射详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java-反射
- 一、反射是什么?
- 二、反射常用API
- 三、总结
一、反射是什么?
反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法。这种动态获取信息,以及动态调用对象方法的功能,叫做java语言的反射机制。反射很强大,有优点也有缺点。
优点:灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。
缺点:执行效率低
元数据(metadata):元数据是指用来描述类的数据,就是class的代码数据。所有的class文件加载到虚拟机之后都会被构建成class对象,class对象描述了一个类都有哪些东西,大家都知道的实现的接口,继承的抽象类,成员变量,类变量,成员方法,类方法,静态方法等,这个class对象就是元数据。
Class类:代表一个类。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
二、反射常用API
基础类 |
package cn.yx.zg.反射.demo3; public class Person { private String name; private int age; public Person() { super(); } public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void eat() { System.out.println("调用无参方法"); } public void eat(int num) { System.out.println("调用有参方法"); } }
1、获取Class的三种方式 |
public static void main(String[] args) throws Exception { Class<Person> clazz1 = (Class<Person>) Class.forName("cn.yx.zg.反射.demo3.Person"); Class clazz2 = Person.class; Person p = new Person(); Class clazz3 = p.getClass(); System.out.println(clazz1 == clazz2);//true System.out.println(clazz2 == clazz3);//true //常用的方式 try { Class npcClazz3 = Class.forName("com.反射机制.demo1.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
2、newInstance方法获得对象 |
Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor (String.class,int.class)方法获取一个指定的构造函数然后再调用
public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.yx.zg.反射.demo3.Person"); //通过无参构造创建对象 Person p = (Person) clazz.newInstance(); System.out.println(p); //通过构造方法参数创建对象 Constructor c = clazz.getConstructor(String.class,int.class); //获取有参构造 Person p2 = (Person) c.newInstance("张三",23); //通过有参构造创建对象 System.out.println(p2); }
3、Field方法操作字段。动态给字段设置值,获取值 |
Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField(“name”)方法获取,通过set(obj, “李四”)方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值
public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.yx.zg.反射.demo3.Person"); Constructor c = clazz.getConstructor(String.class, int.class); //获取有参构造 Person p = (Person) c.newInstance("张刚", 2); //通过有参构造创建对象 //Field f = clazz.getField("name"); //获取姓名字段 //f.set(p, "李四"); //修改姓名的值 Field f = clazz.getDeclaredField("name"); //如果name字段是private权限 暴力反射获取字段 f.setAccessible(true); //去除私有权限 f.set(p, "李四"); //name字段的类型 Class<?> type = f.getType(); System.out.println(type); System.out.println(p); }
4、invoke方法 动态调用指定方法 |
Class.getMethod(String, Class…) 和Class.getDeclaredMethod(String, Class…)方法可以获取类中的指定方法,调用invoke(Object, Object…)可以调用该方法
public static void main(String[] args) throws Exception { Class clazz = Class.forName("cn.yx.zg.反射.demo3.Person"); Constructor c = clazz.getConstructor(String.class, int.class); //获取有参构造 Person p = (Person) c.newInstance("张三", 23); //通过有参构造创建对象 Method m = clazz.getMethod("eat"); //获取eat方法 m.invoke(p); Method m2 = clazz.getMethod("eat", int.class); //获取有参的eat方法 m2.invoke(p, 10); }
三、总结
反射机制是很多Java框架的基石!!!
这篇关于java-反射详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10百万架构师第十三课:源码分析:Spring 源码分析:Spring核心IOC容器及依赖注入原理|JavaGuide
- 2025-01-10便捷好用的电商API工具合集
- 2025-01-09必试!帮 J 人团队解决物流错发漏发的软件神器!
- 2025-01-09不容小觑!助力 J 人物流客服安抚情绪的软件!
- 2025-01-09为什么医疗团队协作离不开智能文档工具?
- 2025-01-09惊叹:J 人团队用啥软件让物流服务快又准?
- 2025-01-09如何利用数据分析工具优化项目资源分配?4种工具推荐
- 2025-01-09多学科协作难?这款文档工具可以帮你省心省力
- 2025-01-09团队中的技术项目经理TPM:工作内容与资源优化策略
- 2025-01-09JIT生产管理法:优化流程,提升竞争力的秘诀