正则表达式和反射

正则表达式和反射

一、正则

进行复杂字符串的处理时使用StringBuffer这些类远远不够于是并有了正则表达式

  1. 正则表达式功能的分类

  1. 匹配String类的matches方法

调用方式Egreturn num.matches("[1-9][0-9]{4,11}"); 其中[1-9][0-9]分别判断num数字的第一位第二位是否分别为1-9的数字和0-9的数字,{4,11}花括号表示位数范围不少于4位不多于11

匹配字符:

Eg2String str = "b8c";

boolean b = str.matches("b[\\W]c");

  [^a-z]不是a-z之间的,\d 0-9\D非数字,\w字符[a-zA-Z_0-9] 26个字母大小写,0-9数字  下划线_\W非字符

匹配数量词:

Eg return num.matches("abc+");//匹配C(匹配符旁边的字符)出现的次数

   ? 一次或者一次也没有,× 零次或多次 ,+ 一次或多次 ,X{n},恰好 n 次,X{n,} 至少 n 次 ,X{n,m}至少 n 次,但是不超过 m

Eg记住验证邮箱的格式:

boolean b = email.matches("[a-zA-Z0-9_]+@[0-9a-z]+(\\.[a-z]+)+");

  1. 切割

切掉重复的字符

String str = "wqqqqadjffffhfdwccccceswwwr";

String[] array = str.split("(.)\\1+");

  1. 替换

把重复的字母切成一个

String str = "wqqqqadjffffhfdwccccceswwwr";

String s = str.replaceAll("(.)\\1+","$1");

System.out.println(s);

  1. 查找  Pattern

    Eg:如下案例获取字符串中含三个字母的单词。

String str="father  and mother i loveyou  where are you from";

      步骤1//运行Pattern类的静态方法compile,对正则样式进行预先编译,运行结果就是pattren对象

      Patternp=Pattern.compile("\\b[a-zA-Z]{3}\\b");

      步骤2//将字符串,和正则进行匹配,用的是Pattern类的非静态方法 matcher,返回的结果是 Matcher对象

      Matcherm=p.matcher(str);

      步骤3//使用Matcher类的方法find查找,返回boolean类型值

      System.out.println(m.find());

      //获取查找结果用Matcher对象的方法group

    System.out.println(m.group());

//  System.out.println(m.start()+"..."+m.end())可以和m.group的效果相同

二、反射

由来:使用户不需要改动源程序就可以改变程序运行效果(扩展程序)。

应用:JavaWeb android底层实现原理有是反射原理。

含义:对一个类的class文件进行解刨,直接从class文件,获取方法并运行

java.lang.Classclass对象进行描述的类。

编程的时候,会写方法,构造方法,成员变量

构造方法。也被看成是对象有构造方法的表述类java.lang.reflect.constructor

成员方法,也被看成是对象有成员方法的表述类java.lang.reflect.Method

成员变量,也被看成是对象,有成员变量对象的描述类 java.lang.reflect.Field

第一种:

Person p=new Person();

Class c1=p.getClass();

第二种Class c2=Person.class

第三种forName(字符串类名)

Classc3=Class.forName(“Person”);//会出异常即使抛出。必须加上包名如下所示。

Classc3=Class.forName(“cn.itcast.redlect.Person”)

静态代码块运行非静态的不运行(必须new对象才会运行)。主推第三种方法

 

开始进行解剖这个文件

    一、获取class文件对象

        获取构造方法,并运行

        私有构造方法,带参数的构造(day27_exercise里面的源程序其中两个public类型的一个空参一个带有两个参数intstring)

public staticvoidmain(String[] args) throws Exception {

      //首先获取class文件对象

      Classc1=Class.forName("Fs.Person");

      //使用class对象中的方法获取构造方法

      Constructor[]cons=c1.getConstructors();//注意后面是Constructor带有s获取的都是public权限的构造方法

      for(Constructorc:cons){

         System.out.println(c);//得到三个构造方法分别是无参有int参和有Sring两种种

      }

      //运行构造方法必须首先创建对象, getConstructor(Class<?>... parameterTypes)

     

      //获取一个构造方法,获取空参数的构造方法

      Constructorcon1=c1.getConstructor();//获取空参数的构造方法

      System.out.println(con1);//运行结果public Fs.Person()

      //运行构造方法,在描述构造方法的类Constructor   newInstance(Object... initargs)参数:调用构造方法的时候传递的

      Objectobj=con1.newInstance();

      System.out.println(obj);//结果空参数的构造方法,Personnull...0null

     

      //同理,获取有参数的构造方法

      Constructorcon2=c1.getConstructor(String.class,int.class);

      System.out.println(con2);

      obj=con2.newInstance("余猛",24); //运行构造方法,赋值。

      System.out.println(obj);//输出结果:有Stringint类的构造方法

                         //Person余猛...24null

     

      //获取私有的构造方法并运行

      // Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 获取单个

      // Constructor[]<T> getDeclaredConstructors(Class<?>... parameterTypes) 获取所有构造方法共有、私有、默认等。

      Constructorcon3=c1.getDeclaredConstructor(int.class);

      /*               构造方法全部输出

       * Constructor[]con4=c1.getDeclaredConstructors();

         for(Constructorc:con4){

            System.out.println(c);}  */

                      

      // Constructor父类 AccessibleObject void setAccessible(boolean flag) 来实现暴力访问

      con3.setAccessible(true);//true时跳过安全性检查

      obj=con3.newInstance(2);

      System.out.println(obj);

   }

注意区分ConstructorsConstructor的区别,以及getDeclaredConstructorsgetDeclaredConstructor的区别

   二、获取成员变量,并修改值

       Field f2=c1.getDeclaredField("name");//获取私有的成员变量

      Fieldf3=c1.getDeclaredField("age");

      Fieldf4=c1.getField("address");//获取公共的成员变量

      Objectobj=c1.newInstance();

      f2.setAccessible(true);//对私有成员变量跳过检查

      f3.setAccessible(true);

      //对成员变量赋值

      f2.set(obj,"余猛");

      f3.set(obj,25);

      f4.set(obj,"武汉");

      System.out.println(obj);//运行结果空参数的构造方法 Person余猛...25武汉

 

 

//获取成员变量getField,getFields以及//getDeclaredFields,getDeclaredField和构造方法是用类似

 

    

    三、获取成员方法,并运行

       Class c1=Class.forName("Fs.Person");

      Methodm=c1.getMethod("show");

      Methodm1=c1.getDeclaredMethod("method", int.class);//注意格式括号里面第一个是方法名第二个是方法参数

      Objectobj=c1.newInstance();

      m.invoke(obj);

      m1.setAccessible(true);

      m1.invoke(obj,3223);

           运行结果

         空参数的构造方法

          show方法公共权限

          method方法私有权限,带有一个参数3223

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值