Java反射

本文深入探讨了Java反射的概念,详细介绍了Class类的常用方法,如获取类名、包名、父类和接口,以及构造方法、属性和方法的获取与操作。此外,还讨论了反射的优缺点,并展示了如何通过反射创建对象、操作属性和调用方法的实例。同时,文章提到了反射调用的优化策略,为实际开发提供了实用指导。
摘要由CSDN通过智能技术生成


获取Class对象

命令解释
Class cls = Class.forName(“java.lang.Cat”)多用于配置文件,读取类全路径,加载类
Class cls = Cat.class多用于参数传递
Class cls = 对象.getClass()通过创建好的对象,获取Class对象
ClassLoader cl = 对象.getClass().getClassLoader()
Class cls = cl.loadClass(“类的全类名”)
通过类加载器获得
Class cls = 基本数据类型.class获取基本数据类型的class对象
Class cls = 包装类.TYPE获得包装类的Class对象

Class对象的基础命令

命令解释
cls.getName()获取对象的名词
cls.getSimpleName()获取简单类名
cls.getPackage().gameName()获取类对象包名
cls.getSupercls().getName()获取类对象父类
cls.getInterfaces()获取类对象接口
cls.getSuperClass以Class形式返回父类信息
cls.getInterfaces以Class[]形式返回接口信息
cls.getAnnotations以Annotation[]形式返回注解信息

获取构造方法

命令解释
cls.getConstructors()获取类对象所有的构造方法
cls.DeclaredConstructors获取本类中所有方法
cls.getConstructor()获取类对象的无参构造
cls.newInstance()使用无参构造创建一个对象
cls.getConstructor(String.cls,int cls)获取类中的带参构造
cls.newInstance(“王五”,20)使用有参构造创建一个对象
constructor.getModifiers以int形式返回修饰符
constructor.getName返回构造器名(全类名)
constructor.getParameterTypes以Class[]返回参数类型数组

获取属性

命令解释
cls.getField()获取属性(字段)公开的字段,父类继承的字段
cls.getDeclaredFirelds()获取所有属性包括私有,默认,保护
cls.getFields(“name”)获取单一属性(name为属性名)
Field namefield = cls.getFields(“name”)
Person p = (Person)cls.newInstance()
namefield.set(p,“张三”)
赋值/修改属性的值
Field namefield = cls.getFields(“name”)
Person p = (Person)cls.newInstance()
namefield.get( p )
获取属性的值
field.getName()返回属性名
field.getType()以Class形式返回类型
field.getModifiers以int形式返回修饰符
获取方法
命令解释
-------------
cls.getMethods()获取公开的方法和父类继承的方法
cls.getDeclaredMethods()获取公开的方法和私有方法,不能获取父类继承的方法
cls.getMethod(“eat”)获取无参方法
cls.getMethod(“eat”,String.cls)获取带参方法
cls.getDeclaredMethod()获取私有方法
Method eatMethod = cls.getMethod(“eat”)
eaMethod.invoke(zhangsan)
执行无参方法
zhangsan,eat();
Method eatMethod = cls.getMethod(“eat”,String.cls)
eaMethod.invoke(zhangsan,“香蕉”)
执行带参方法
zhangsan.eat(“香蕉”)
Method eatMethod = cls.getMethod(“eat”)
eatMethod.invoke(null)
执行无参静态方法
Person.eat()
Method eatMethod = cls.getMethod(“eat”,String.cls)
eaMethod.invoke(null,“香蕉”)
执行带参静态方法
Person.eat(“香蕉”)
method.getReturnType()以Class形式获取返回类型
method.getName()返回方法名
method.getParameterTypes以Class[]返回参数类型数组

爆破

命令解释
construcrtor.setAccessible(true)使反射可以访问private构造器
field.setAccessible(true)使反射可以访问private属性
method.setAccessible(true)使反射可以访问private方法

获取对象

//获取对象
//无参直接获取
Person p = (Person) aClass.newInstance();
//带参,先指定参数类型
Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
Person p2 = (Person) constructor.newInstance("王五", 20);

获取属性

//获取属性
Field name = aClass.getDeclaredField("name");
//如果是私有属性,需要爆破
name.setAccessible(true);
name.set(p2, "李四");
System.out.println(name.get(p2));

Field job = aClass.getDeclaredField("job");
job.setAccessible(true);
//如果是静态属性,可以不指定对象
job.set(null, "程序员");
System.out.println(job.get(p2));

获取方法

//获取方法
Method t1 = aClass.getDeclaredMethod("t1");
t1.invoke(p2);
//带参方法
Method t2 = aClass.getDeclaredMethod("t2", String.class, int.class);
t2.invoke(p2, "小明", 30);

什么是反射

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

反射常用类

在这里插入图片描述

在这里插入图片描述

反射的优缺点

在这里插入图片描述

Class类

在这里插入图片描述
1.Class也是类,因此也继承Object类
在这里插入图片描述
2.Class对象不是new出来的,而是系统创建的
在加载阶段,就会在堆中创建类对象

3.对于某个类的Class类对象,在内存那种只有一份,因为类只加载一次
Class对象相当于一个模板
在这里插入图片描述
在这里插入图片描述

Class类常用方法

请添加图片描述
在这里插入图片描述
在这里插入图片描述

获取Class的名字、包名、父类、接口

在这里插入图片描述
在这里插入图片描述

获取Class的构造方法并使用

在这里插入图片描述
在这里插入图片描述

获取Class属性

在这里插入图片描述

获取Class的方法

获取类的所有方法
在这里插入图片描述
在这里插入图片描述

获取类的单一方法
在这里插入图片描述
在这里插入图片描述

使用反射实现一个可以调用任何对象方法的通用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Class对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取Class对象的六种方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

类加载

在这里插入图片描述

在这里插入图片描述

类加载流程

在这里插入图片描述
在这里插入图片描述
加载阶段
在这里插入图片描述
验证
在这里插入图片描述
准备
在这里插入图片描述
在这里插入图片描述

解析
符号引用转换为内存地址引用
在这里插入图片描述
初始化
在这里插入图片描述

获取类结构信息

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

通过反射创建对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过反射操作属性

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

通过反射操作方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

练习
在这里插入图片描述

在这里插入图片描述

反射调用优化

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值