java反射,正则表达式

1、反射-概述
反射就是在程序运行过程中,通过.class文件动态的获取类的信息(属性,构造,方法),并调用

注意:JAVA不是动态语言,因为动态语言强调在程序运行过程中不仅能获取并调用类里面的属性和方法,还要求能够给类增加属性和方法,而JAVA中的反射只能获取调用,不能修改类的结构

在反射中包含Declared的方法表示获取私有的成员内容,一般结合setAccessible(true)方法一起使用

2、创建Class文件的三种方式
Class.forName(“类全名”);
对象名.getClass();
类名.class

      推荐使用:Class.forName("类全名");

3、获取构造方法并创建对象
概述:
java.lang.reflect.Constructor:构造方法管理器,通过该对象的newInstance方法能有创建构造方法
一、步骤
1、获取Class对象
2、通过调用getDeclaredConstructor或者getConstructor 方法创建构造器(Constructor)对象,如果构造方法没有形式参数写null
public Constructor getDeclaredConstructor(形式参数1对应的.class对象, 形式参数2对应的.class对象….):该方法可以获取私有构造方法
public Constructor getConstructor(形式参数1对应的.class对象, 形式参数2对应的.class对象….):该方法不能获取私有构造方法
3、如果获取到的是私有的构造方法的构造器对象,需要调用构造器对象的setAccessible(true)方法
4、通过构造器对象的newInstance(实际参数1, 实际参数2)创建对象,如果没有实际参数写null

二、举例
1、通过private Person(String name, int age)创建对象
Class clazz = Class.forName(“com.itcast.Person”);//必须通过类全名获取
Constructor con = clazz.getDeclaredConstructor(String.class, int.class);//形式参数列表对应的.class列表
con.setAccessible(true);//此处不设置,无法创建该对象,因为构造方法是私有的
Object obj = con.newInstance(“zhangsan”,120);//调用newInstance(实际参数列表)创建对象

 2、通过public Person()创建对象
      Class clazz =  Class.forName("com.itcast.Person");//必须通过类全名获取
      Constructor con = clazz.getDeclaredConstructor(null);//因为没有形式参数,所以写null
      con.setAccessible(true);//此处不设置,无法创建该对象,因为构造方法是私有的
      Object obj = con.newInstance();//因为不需要实际参数,所以调用无参的newInstance方法

4、获取属性并调用
概述:
java.lang.reflect.Field:属性管理器对象,可以对该类的对象的属性值进行修改和获取

一、步骤
1、获取Class对象
2、通过调用getDeclaredField(“属性名”)或通过调用getField(“属性名”) 获取属性管理器
3、如果获取的是私有的属性,调用属性管理器的setAccessible(true)方法
4、调用属性管理器的set(该类的对象,值) 来设置属性值
调用属性管理器的get(该类的对象)来获取属性值

二、举例
Person p1 = new Person();
Person p2= new Person();
Class clazz = Class.forName(“Person”);//第一步获取Class对象
Field field = clazz.getDeclaredField(“name”);//第二步通过调用getDeclaredField(“属性名”)或通过调用getField(“属性名”) 获取属性管理器
field.setAccessible(true);//第三步如果获取的是私有的属性,调用属性管理器的setAccessible(true)方法
field.set(p1, “张三”);//第四步用属性管理器的set(该类的对象,值) 来设置属性值
field.set(p2, “李四”);
System.out.println(field.get(p1));//第四步调用属性管理器的get(该类的对象)来获取属性值
System.out.println(field.get(p2));
5、获取成员方法并调用(掌握)
概述:
java.lang.reflect.Method:方法管理器,可以执行该类的对象的方法

一、步骤
1、获取Class对象
2、通过调用getDeclaredMethod(“方法名”,形式参数1.class, 形式参数2.class..)或通过调用geMethod(“方法名”,形式参数1.class, 形式参数2.class..) 获取属性管理器,如果没有形式参数写null
3、如果获取的是私有的方法,调用方法管理器的setAccessible(true)方法
4、通过属性管理器的invoke(该类的对象,实际参数)来执行方法,如果没有实际参数写null

二、案例

     Person p1 = new Person("张三",13);
          Person p2= new Person("李四",14);
          Class clazz =  Class.forName("Person");
          /*
          * 调用setName方法
          */
          Method setName = clazz.getDeclaredMethod("setName", String.class);
          setName.setAccessible(true);//如果getName方法是私有的,此处必须写
          setName.invoke(p1, "张三改");
          /*
          * 调用getName方法
          */
          Method getName = clazz.getDeclaredMethod("getName", null); //获取Person类的getName方法对应的方法管理器
          getName.setAccessible(true);//如果getName方法是私有的,此处必须写
          Object object = getName.invoke(p1, null);//执行p1对象的getName方法,并且将返回值赋值给object
          System.out.println(object);

6、反射练习
1:通过反射修改成员变量的值,包括私有
2: 通过反射运行配置文件
在JAVA项目下新建配置文件config,内容为
class=Person
name=jack

          Properties p = new Properties();
          p.load(new FileReader("config"));
          String className  = (String)p.get("class");
          String name = (String)p.get("name");
          Class clazz = Class.forName(className);
          //创建对象
          Constructor constructor = clazz.getConstructor(null);
          Object instance = constructor.newInstance();
          //通过setName设置name属性
          Method setName = clazz.getDeclaredMethod("setName", String.class);
          setName.invoke(instance,name );
          //通过getName设置name属性
          Method method = clazz.getDeclaredMethod("getName",null);
          Object object = method.invoke(instance, null);
          System.out.println(object);

3: 通过反射给 ArrayList中添加String 类型的数据

       ArrayList<Integer> list = new ArrayList<Integer>();
          list.add(123);
        Class clazz =  Class.forName("java.util.ArrayList");//必须通过类全名获取
        Method method = clazz.getDeclaredMethod("add", Object.class);
        method.setAccessible(true);
        method.invoke(list, "ss");
        for(Object obj: list){
             System.out.println(obj);
        }

7、正则表达式
(1)概念
就是符合一定规则的字符串
(2)规则字符:

 (3)常用功能:
      1:判断功能
           String -- matches
      2:切割功能
           String -- split
      3:替换功能
           String -- replaceAll
      4:获取功能
           Pattern
           Matcher

           compile()
           find()
           group()

(1):特殊字符
\:反斜线
\r:回车
\n:换行

(2):字符类
[abc]:a,b或者c的任意一个。
[^abc]:除了a,b,c以外的字符。
[a-zA-Z]:包括了26个英文字母。
[0-9]:包括了0-9这个10个数字字符。

(3):预定义字符类
. 任意字符
\d 数字[0-9]
\D 非数字[^0-9]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

(4):边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界

(5):Greedy 数量词
x? 0次或1次
x* 0次或多次
x+ 1次或多次
x{n} 恰好n次
x{n,} 至少n次
x{m,n} 至少m次,但不能超过n次

8、常见的正则表达式
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]>.?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过自定义注解来实现List<String>的正则表达式验证。下面是一个简单的示例: ```java import java.lang.annotation.*; import java.util.List; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface RegexList { String value(); } public class RegexValidation { public static boolean validate(Object obj) throws IllegalAccessException { for (Field field : obj.getClass().getDeclaredFields()) { if (field.isAnnotationPresent(RegexList.class)) { field.setAccessible(true); Object fieldValue = field.get(obj); if (fieldValue instanceof List) { List<String> list = (List<String>) fieldValue; String regex = field.getAnnotation(RegexList.class).value(); for (String str : list) { if (!str.matches(regex)) { return false; } } } } } return true; } } ``` 在上述示例中,我们首先定义了一个注解 `@RegexList`,用于标记需要进行正则表达式验证的List<String>类型的字段。该注解包含一个属性 `value`,用于指定正则表达式。在 `RegexValidation` 类中,我们通过反射获取到对象的所有字段,如果字段被 `@RegexList` 注解标记,则进行正则表达式验证。 使用时,我们只需要在需要进行List<String>类型字段的正则表达式验证的类中,使用 `@RegexList` 注解标记该字段,例如: ```java public class MyClass { @RegexList("\\d+") private List<String> list; } ``` 在需要进行验证的时候,只需要调用 `validate` 方法,并传入需要验证的对象即可,例如: ```java MyClass obj = new MyClass(); obj.list = Arrays.asList("123", "456", "789"); boolean isValid = RegexValidation.validate(obj); System.out.println(isValid); // 输出:true,因为所有的字符串都是数字 ``` 希望这个示例可以帮助您解决问题。如果您还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值