正则表达式和反射

前端之家收集整理的这篇文章主要介绍了正则表达式和反射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@

正则表达式和反射

@H_301_0@

一、正则

@H_301_0@

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

@H_301_0@
  1. 正则表达式功能分类

@H_301_0@
  1. 匹配String类的matches方法

@H_301_0@

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

@H_301_0@

匹配字符:

@H_301_0@

Eg2String str = "b8c";

@H_301_0@

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

@H_301_0@

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

@H_301_0@

匹配数量词:

@H_301_0@

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

@H_301_0@

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

@H_301_0@

记住验证邮箱的格式:

@H_301_0@

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

@H_301_0@
  1. 切割

@H_301_0@

切掉重复的字符

@H_301_0@

String str = "wqqqqadjffffhfdwccccceswwwr";

@H_301_0@

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

@H_301_0@
  1. 替换

@H_301_0@

把重复的字母切成一个

@H_301_0@

String str = "wqqqqadjffffhfdwccccceswwwr";

@H_301_0@

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

@H_301_0@

System.out.println(s);

@H_301_0@
  1. 查找 Pattern

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

Matcherm=p.matcher(str);

@H_301_0@

步骤3使用Matcher类的方法find查找,95); font-family:宋体; font-size:12pt">返回boolean类型值

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

二、反射

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

第一种:

@H_301_0@

Person p=new Person();

@H_301_0@

Class c1=p.getClass();

@H_301_0@

第二种Class c2=Person.class

@H_301_0@

第三种forName(字符串类名)

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

@H_301_0@

开始进行解剖这个文件

@H_301_0@

一、获取class文件对象

@H_301_0@

获取构造方法,并运行

@H_301_0@

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

@H_301_0@

public staticvoidmain(String[] args) throws Exception {

@H_301_0@

首先获取class文件对象

@H_301_0@

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

@H_301_0@

对象中的方法获取构造方法

@H_301_0@

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

@H_301_0@

for(Constructorc:cons){

@H_301_0@

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

@H_301_0@

}

@H_301_0@

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

@H_301_0@

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

Objectobj=con1.newInstance();

@H_301_0@

System.out.println(obj);结果空参数的构造方法301_0@

@H_301_0@

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

@H_301_0@

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

@H_301_0@

System.out.println(con2);

@H_301_0@

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

@H_301_0@

System.输出结果:有String类的构造方法

@H_301_0@

//Person余猛...24null

@H_301_0@

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

Constructorcon3=c1.getDeclaredConstructor(class);

@H_301_0@

/* 构造方法全部输出

@H_301_0@

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

@H_301_0@

for(Constructorc:con4){

@H_301_0@

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

@H_301_0@

@H_301_0@

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

@H_301_0@

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

@H_301_0@

obj=con3.newInstance(2);

@H_301_0@

System.out.println(obj);

@H_301_0@

}

@H_301_0@

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

@H_301_0@

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

@H_301_0@

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

@H_301_0@

Fieldf3=c1.getDeclaredField("age");

@H_301_0@

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

@H_301_0@

Objectobj=c1.newInstance();

@H_301_0@

f2.setAccessible(对私有成员变量跳过检查

@H_301_0@

f3.setAccessible(true);

@H_301_0@

对成员变量赋值

@H_301_0@

f2.set(obj,255); font-family:Consolas; font-size:12pt">");

@H_301_0@

f3.set(obj,25);

@H_301_0@

f4.set(obj,255); font-family:宋体; font-size:12pt">武汉");

@H_301_0@

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

@H_301_0@

@H_301_0@

@H_301_0@

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

@H_301_0@

@H_301_0@

@H_301_0@

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

@H_301_0@

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

@H_301_0@

Methodm=c1.getMethod("show");

@H_301_0@

Methodm1=c1.getDeclaredMethod("method",85); font-family:Consolas; font-size:12pt">class);注意格式括号里面第一个是方法名第二个是方法参数

@H_301_0@

Objectobj=c1.newInstance();

@H_301_0@

m.invoke(obj);

@H_301_0@

m1.setAccessible(true);

@H_301_0@

m1.invoke(obj,3223);

@H_301_0@

运行结果

@H_301_0@

空参数的构造方法

@H_301_0@

show方法公共权限

@H_301_0@

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

猜你在找的正则表达式相关文章