反射学习

本文深入探讨Java反射机制,解析如何动态获取类信息及调用方法,同时介绍正则表达式的应用,助力高效字符串操作。

反射机制+正则表达式

反射

Java反射机制是指在运行状态下,对于任意一个类(class文件),都能够知道这个类的所有的属性和方法

对于任意一个对象,都能够调用它的任意的一个方法和属性

通过这种动态地获取信息以及调用对象的方法的功能称为Java语言的反射机制

获取字节码对象的方式

1.Object类中的getClass()方法

Person p1 = new Person();
Class clazz1 = p1.getClass();
	
Person p2 = new Person(1, "asd");
Class clazz2 = p2.getClass();
	
System.out.println(clazz1 == clazz2);

result:
	true

想要用这种方式,必须要明确具体的类,并创建对象,很麻烦

2.任何数据类型都具备一个静态的属性.class来获取其对应的Class对象

Class clazz1 = Person.class;
Class clazz2 = Person.class;
System.out.println(clazz1 == clazz2);
result:
	true

相对简单,但是还是要明确用来类中的静态成员,还是不够扩展

3.只要通过给定的类的字符串名称,就可以获取该类。可以使用Class类中的方法完成,该方法就是forName

String className = "study.Person";
Class clazz1 = Class.forName(className);
Class clazz2 = Class.forName(className);
System.out.println(clazz1 == clazz2);

result:
	true

这种方式只要有名称即可,更为方便,扩展性更强

注意:传入的className是类的路径+类名

获取对象

如果想要使用对象,就用一个Object类来获取

Object obj = clazz1.newInstance();
使用构造方法获取对象

如果调用的对象需要使用有参的构造函数的话

String className = "study.Person";
Class clazz1 = Class.forName(className);
Constructor constructor = clazz1.getConstructor(String.class, int.class);
for (int i = 0; i < clazz1.getConstructors().length; i++) {
	System.out.println(clazz1.getConstructors()[i]);
}
Object obj = constructor.newInstance("asd", 123);

result:
	public study.Person(java.lang.String,int)
	public study.Person()
	person param runasd:123

总之,要想调用类当中的方法,就用class中的getMethods(),会返回method数组

如果想要运行方法,使用Method类中的
Object invoke(Object obj, Object… args)//在具有指定参数的 方法对象上调用此 方法对象表示的底层方法

想要调用构造方法,就用getConstructors()

获取字段的话,就用getFields()

当然,上面的方法返回的都是公有的东西

如果需要返回私有的话:前面加上一个Declared。如:getDeclaredFields()

当然,获取对象的时候,用Object类来接收

Method和Constructor的父类们

AccessibleObject类是Field,Method和Constructor对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。 当使用Fields,Methods或Constructors来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问检查(对于public,默认(包)访问,受保护和私有成员) , 分别在反射对象中设置accessible标志允许具有足够权限的复杂应用程序(如Java对象序列化或其他持久性机制)以通常被禁止的方式操纵对象

默认情况下,反射对象不可访问

Executable:Method和Constructor的共同功能的共享超类

下面就是Method和Constructor

随想

其实学完反射之后,会有一个疑问,就是说反射机制是否破坏了类的封装呢?

因为反射机制是通过类的字节码文件来获取类的所有信息,不管是私有还是共有的属性、方法等,它都可以获取到。

其实可以这样想,其他地方再怎么调用,他还是需要获取这个类的实例化对象,用Object类来封装。

与此同时,如果想要强行调用私有的方法或者属性的时候,会抛出IllegalAccessException

所以,反射机制没有破坏Java封装的特性

正则表达式

用于操作字符串数据,与平常理解的正则表达式一样

具体的…我觉得不要记,需要用的时候查

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值