反射基础篇

本文深入探讨了Java中的反射机制,包括如何通过Class对象获取类的构造方法、属性和方法,并展示了如何利用反射创建对象、调用方法。此外,还提供了将String类型数据存入Integer ArrayList的示例,揭示了反射在实际编程中的实用价值。
摘要由CSDN通过智能技术生成

反射

必要概念:

Class类:不同的类之间的共同点提取出来组成Class类

Class对象:每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, short, int, long, float,double)有Class对象,数组有Class对象,就连关键字void也有Class对象(void.class)

获得Class对象的方式(三种)

  • Class.forName(“类路径”)
  • 实例对象.getClass()
  • 类 类名 = new 类(); 类名.class ;

注意: 建议推荐使用第一种方式(Class.forName的好处就在于,不需要为了获得Class引用而持有该类型的对象)

通过Class对象获得类中的构造方法

Class对象.getConstructor()

  • 无参数:只会获得公共没有参数的构造方法
  • 有参数:获得公共的有参数的构造方法
//定义参数的类型
Class[] aa = {String.class};
//传入参数的类型获得有参公共的构造方法
Constructor<User> constructor2 = cc.getConstructor(aa);

Class对象.getConstructors()----------------------------->获得所有的公共的构造方法(包括有参的和无参的)

Class对象.getDeclaredConstructor()

  • 无参数:可以获得所有的无参构造方法
  • 有参数:可以获得所有有参的构造方法,需要传入参数
//定义参数的类型,有几个参数就写几个xxx.class
Class[] aa = {String.class,int.class};
//传入参数的类型获得有参的构造方法
Constructor<User> constructor = cc.getDeclaredConstructor(aa);

Class对象.getDeclaredConstructors()------------------------->获得所有的构造方法(包括有参的和无参的)

通过Class对象获得的构造方法创建对象

//创建数组存放有参构造的参数类型
Class[] a = {String.class,int.class};
//传入参数创建有参构造
Constructor<User> constructor = cc.getDeclaredConstructor(a);
//打开权限
constructor.setAccessible(true);
//通过构造方法创建对象
User user = constructor.newInstance("哈哈",18);
//输出结果
System.out.println(user.getName() + "=" + user.getAge());

通过Class对象获取属性

  • Class对象.getField(“参数名”): 只能获得一个公共的参数
  • Class对象.getFields(): 返回值是一个数组,获得所有的公共的参数
  • Class对象.getDeclaredField(“参数名”): 能够获得任意想要获取的参数但是只能获得一个
  • Class对象.getDeclaredFields(): 返回值是一个数组,获得所有的参数(私有的,公共的都可以)

通过Class对象执行方法

Class对象.getMethod(“参数”)

​ 参数------------>想要获得的方法名(只能是公共的方法)

​ 想要获得的方法,有参数时,需定义方法的参数类型并传入到getMethod()中具体如下:

Class对象.getMethods():

注意: 获得Object对象中的方法(9个) + Class对象中的公共方法

Class对象.getDeclaredMethod(“参数”):

​ 参数------------>想要获得的方法名 (任意的方法都可以获取)

​ 想要获得的方法,有参数时,需定义方法的参数类型并传入到getMethod()中具体如下:

//定义想要获得的方法参数类型有几个写几个
Class[] a = {String.class};
//通过Class对象获得方法
Method method = cc.getMethod("sleep",a);
//打开私有方法的权限
method.setAccessible(true);
//创建方法的参数数组
Object[] args = {"呵呵"};
//调用方法,传入对象参数和数组(必须先创建出一个对象如果创建对象的构造方法是私有的必须也要打开权限再创建对象)
method.invoke(user,args);

Class对象.getDeclaredMethods():

注意: 只会获得Class对象中的所有方法、[与 getMethods() 方法不要混淆 ]

扩展(怎么向Integer类型的ArrayList集合中存入String类型的数据)

//创建Integer类型的ArrayList集合
ArrayList<Integer> list = new ArrayList<>();
//向集合中存入数据
list.add(1);
//通过集合对象创建Class对象
Class cc = list.getClass();
//add方法传入的参数类型
Class[] parameterTypes = { Object.class };
//获得add方法
Method method = cc.getDeclaredMethod("add", parameterTypes);
//向add方法中传入参数
Object[] args = { "哈哈" };
//调用方法
method.invoke(list, args);
//输出集合
System.out.println(list);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值