admin管理员组

文章数量:1579084

一 反射

1 什么是反射

JAVA反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

2 Class类

有三种获得Class对象的方式:

  1. Class.forName(“类的全限定名”)

  2. 实例对象.getClass()

  3. 类名.class (类字面常量)

    Class clz = Class.forName("com.ycy.entity.User");
    //1 获取类名
    //全限定名
    String name = clz.getName();
    //类名
    String simpleName = clz.getSimpleName();
    //2 创建对象:无参构造函数创建对象
    Object o = clz.newInstance();
    System.out.println("类的全限定名是:"+name+",类名是:"+simpleName);

结果:

3 Field类

        //获取所有字段
        Field[] fields = clz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            //获取字段名
            String name1 = fields[i].getName();
            System.out.println("字段名是:"+name1);
        }
        //获取某个字段
        Field field = clz.getDeclaredField("name");
        //允许暴力反射
        field.setAccessible(true);
        //给字段赋值
        field.set(o,"小小");
        System.out.println(o);

结果:

4 Constructor类

        // 获取所有构造函数
        Constructor[] declaredConstructors = clz.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) {
            System.out.println(declaredConstructors[i]);
        }
        //获取某个构造函数
        Constructor constructor = clz.getDeclaredConstructor(Integer.class, String.class, String.class);
        //允许暴力反射
        constructor.setAccessible(true);
        //使用构造函数创建对象
        Object o1 = constructor.newInstance(111, "小白", "abc123");
        System.out.println("使用Constructor创建对象o1:"+o1);
​

结果:

5 Method类

        //获取所有方法
        Method[] declaredMethods = clz.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            System.out.println(declaredMethods[i]);
        }
        //获取某一个方法
        Method method = clz.getDeclaredMethod("eat", String.class);
        //允许暴力访问
        method.setAccessible(true);
        //调用该方法
        method.invoke(o1,"米饭");

二 正则表达式

1 什么是正则表达式

    正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。
    一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。

2 特殊字符

(1)预定义字符

预定义字符说明
.可以匹配任何字符
\d匹配 0~9 的所有数字
\D匹配非数字
\s匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S匹配所有的非空白字符
\w匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
\W匹配所有的非单词字符
上面的 7 个预定义字符其实很容易记忆,其中:
- d 是 digit 的意思,代表数字。
- s 是 space 的意思,代表空白。
- w 是 word 的意思,代表单词。
- d、s、w 的大写形式恰好匹配与之相反的字符

(2)数量表示符

贪婪模式勉强模式说明
X?X??X表达式出现零次或一次
X*X*?X表达式出现零次或多次
X+X+?X表达式出现一次或多次
X{n}X{n}?X表达式出现 n 次
X{n,}X{n,}?X表达式最少出现 n 次
X{n,m}X{n,m}?X表达式最少出现 n 次,最多出现 m 次
String str = "hello,java!";
// 贪婪模式的正则表达式
System.out.println(str.replaceFirst("\\w*" , "■"));    //输出■,java!
// 勉强模式的正则表达式
System.out.println(str.replaceFirst("\\w*?" , "■""));    //输出■hello, java!
Greedy(贪婪模式):
    数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
    如果你发现表达式匹配的结果与预期的不符,很有可能是因为你以为表达式只会匹配前面几个字符,而实际上它是贪婪模式,所以会一直匹配下去。
Reluctant(勉强模式):
    用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。

 (3) 方括号表达式[]

方括号表达式说明
表示枚举例如[abc]表示 a、b、c 其中任意一个字符;[gz]表示 g、z 其中任意一个字符
表示范围:-例如[a-f]表示 a~f 范围内的任意字符;[\\u0041-\\u0056]表示十六进制字符 \u0041 到 \u0056 范围的字符。范围可以和枚举结合使用,如[a-cx-z],表示 a~c、x~z 范围内的任意字符
表示求否:^例如[^abc]表示非 a、b、c 的任意字符;[^a-f]表示不是 a~f 范围内的任意字符
表示“与”运算:&&例如 [a-z&&[def]]是 a~z 和 [def] 的交集,表示 d、e f[a-z&&^bc]]是 a~z 范围内的所有字符,除 b 和 c 之外 [ad-z] [a-z&&[m-p]]是 a~z 范围内的所有字符,除 m~p 范围之外的字符
表示“并”运算并运算与前面的枚举类似。例如[a-d[m-p]]表示 [a-dm-p]

(4)圆括号表达式()

    用于将多个表达式组成一个子表达式,圆括号中可以使用或运算符|。
        String str = "public";
        System.out.println(str.matches("((public)|(protected)|(private))"));
        str = "protected";
        System.out.println(str.matches("((public)|(protected)|(private))"));
        str = "private";
        System.out.println(str.matches("((public)|(protected)|(private))"));

结果:

本文标签: 正则反射基础Java