反射机制+正则表达式
反射
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封装的特性
正则表达式
用于操作字符串数据,与平常理解的正则表达式一样
具体的…我觉得不要记,需要用的时候查
本文深入探讨Java反射机制,解析如何动态获取类信息及调用方法,同时介绍正则表达式的应用,助力高效字符串操作。
1762

被折叠的 条评论
为什么被折叠?



