java基础---反射、正则

java基础—反射、正则

一、反射

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

  • 获取字节码对象的方式(三种):

    • 1、 使用Object类中的getClass()方法的。

      Class clazz=对象名.getClass();

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

      Class clazz=类名.Class;

    • 3、只要通过给定的类的字符串名称就可以获取该类。

      Class clazz=Class.forName(包名.类名);

  • 获取 Class 对象所表示的类的一个新实例

    • 获取空参数构造函数:

      Object obj=Class.newInstance( );

    • 获取指定的构造函数对象:

      Constructor constructor=Class.getConstructor(参数类型.Class,…参数类型.Class );//获得一个构造器

      Object obj=constructor.newInstance(传入实际参数);//通过该构造器对象的newInstance方法进行对象的初始化。

  • 获取Class的字段

    • getField(String name):返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

    • getDeclaredField(String name): 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。(可访问私有属性

      • Field类中的方法:

        • setAccessible(boolean flag):访问私有属性时,flag需设置为true。

        • set(Object obj, Object value) :将指定对象变量上此 Field 对象表示的字段设置为指定的新值。

        • get(Object obj) :返回指定对象上此 Field 表示的字段的值。

  • 获取Class中的方法

    • 第一种方法:

      Method[] methods = Class.getMethods();//获取类中所有的公有方法。

      Method[] methods= Class.getDeclaredMethods();//获取类中所有方法,包括
      私有。

    • 第二种方法:

      Method method = Class.getMethod(String name, 参数类型.Class,…参数类型.Class) ;// 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法

  • 示例:

    • Person类:
public class Person 
{
    private String name;
    private int age;

    public Person(int age,String name)
    {
        super();
        this.age=age;
        this.name=name;

        System.out.println("Person param run………"+this.name+":"+this.age);
    }
    public Person()
    {
        super();

        System.out.println("Person run");
    }

    public void show()
    {
        System.out.println(name+"……show run……"+age);
    }
    private void privateMethod()
    {
        System.out.println("method run");
    }
    public void paramMethod(String str ,int num)
    {
        System.out.println("paramMethod run……"+str+":"+num);
    }
    public static void staticMethod()
    {
        System.out.println("static method run……");
    }
}
  • Class方法的演示:
import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
class ReflectDemo1 
{
    public static void main(String[] args) throws Exception
    {
        String className="Person"; //类的字符串名称

        Class clazz=Class.forName(className);//通过Class类中forName方法获得该类

        Person p=(Person)clazz.newInstance();//调用空参数创建对象

        System.out.println("------------");

        Field field=clazz.getDeclaredField("age");//获取私有字段

        field.setAccessible(true);//对私有字段的访问取消权限检查,暴力访问。

        field.set(p,10);//设置Person对象中的age属性值

        Object o=field.get(p);//获取age的值

        System.out.println("获取的字段信息:"+field);//私有字段信息

        System.out.println("设置的年龄:"+o);

        System.out.println("------------");

        Method method= clazz.getDeclaredMethod("privateMethod",null);//获取私有方法

        method.setAccessible(true);//取消权限检查,暴力访问

        method.invoke(p,null);//运行Person类中privateMethod方法

    }

}
  • 输出结果:
    这里写图片描述

二、正则

  • 特点:

    • 正则表达式用于操作字符串数据。

    • 通过一些特定的符号来体现的。

  • 正则表达式常用构造摘要

    • 字符类:

      • [abc] a、b 或 c(简单类)

      • [^abc] 任何字符,除了 a、b 或 c(否定)

      • [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

    • 预定义字符类:

      • \d 数字:[0-9]

      • \D 非数字: [^0-9]

      • \s 空白字符:[ \t\n\x0B\f\r]

      • \S 非空白字符:[^\s]

      • \w 单词字符:[a-zA-Z_0-9]

      • \W 非单词字符:[^\w]

    • Greedy 数量词:

      • X? X,一次或一次也没有

      • X* X,零次或多次

      • X+ X,一次或多次

      • X{n} X,恰好 n 次

      • X{n,} X,至少 n 次

      • X{n,m} X,至少 n 次,但是不超过 m 次

    • 边界匹配器:

      • ^ 行的开头

      • $ 行的结尾

      • \b 单词边界

      • \B 非单词边界

      • \A 输入的开头

      • \G 上一个匹配的结尾

      • \Z 输入的结尾,仅用于最后的结束符(如果有的话)

      • \z 输入的结尾

  • 正则表达式常见功能

    • 匹配
      • 其实使用的就是String类中的matches方法
    • 切割
      • 其实使用的就是String类中的split方法
    • 替换
      • 其实使用的就是String类中的replaceAll方法
    • 获取
      • 将正则规则进行对象的封装 ,通过正则对象的matcher方法与字符串相关联。
  • 示例:

    • 代码:
import java.util.regex.*;
class RegexDemo2 
{
    public static void main(String[] args) 
    {
        functionDemo_1();
        System.out.println("------------");
        functionDemo_2();
        System.out.println("------------");
        functionDemo_3();
        System.out.println("------------");
        functionDemo_4();
    }
    //演示匹配
    public static void functionDemo_1()
    {
        //匹配手机号是否正确
        String tel="13824955439";
        //定义一个正则表达式
        String reg="1[358]\\d{9}";
        boolean b=tel.matches(reg);
        System.out.println(tel+":"+b);
    }
    //演示切割
    public static void functionDemo_2()
    {
        String str="zhaoshan xiaoqiang     liliu";
        //一个或多个空格
        String reg=" +";
        String[] names=str.split(reg);
        for (String name:names )
        {
            System.out.println(name);
        }
    }
    //演示替换
    public static void functionDemo_3()
    {
        String str="13876535946";
        //$1表示前一个参数的第一组,$3表示前一个参数的第三组
        str=str.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$3");
        System.out.println(str);
    }
    //演示获取
    public static void functionDemo_4()
    {
        String str = "da jia hao,ming tian bu fang jia";
         //\\b表示单词边界
        String reg="\\b[a-z]{3}\\b";
        //将正则表达式进行封装成对象
        Pattern p=Pattern.compile(reg);
        //通过正则对象获取匹配器对象
        Matcher m=p.matcher(str);
        //查找:find();
        while (m.find())
        {
            System.out.println(m.group());//获取匹配的子序列
            System.out.println(m.start()+":"+m.end());
        }

    }
}
  • 输出结果:
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/ly_20104803/article/details/49720563