正则表达式和反射
一、正则
进行复杂字符串的处理时使用String,Buffer这些类远远不够于是并有了正则表达式
-
匹配String类的matches方法
调用方式Eg:return num.matches("[1-9][0-9]{4,11}"); 其中[1-9][0-9]分别判断num数字的第一位第二位是否分别为1-9的数字和0-9的数字,{4,,11}花括号表示位数范围不少于4位不多于11位
匹配字符:
Eg2:String str = "b8c";
boolean b = str.matches("b[\\W]c");
[^a-z]不是a-z之间的,\d0-9、\D非数字,\w字符[a-zA-Z_0-9] 26个字母大小写,0-9数字 下划线_\W非字符
匹配数量词:
return num.matches("abc+");//匹配C(匹配符旁边的字符)出现的次数
? 一次或者一次也没有,× 零次或多次 ,+ 一次或多次 ,X{n},恰好 n 次,X{n,} 至少 n 次 ,X{n,m}至少 n 次,但是不超过 m 次
:记住验证邮箱的格式:
boolean b = email.matches("[a-zA-Z0-9_]+@[0-9a-z]+(\\.[a-z]+)+");
-
切割
切掉重复的字符
String str = "wqqqqadjffffhfdwccccceswwwr";
String[] array = str.split("(.)\\1+");
-
替换
把重复的字母切成一个
String str = "wqqqqadjffffhfdwccccceswwwr";
String s = str.replaceAll("(.)\\1+","$1");
System.out.println(s);
-
查找 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将字符串,和正则进行匹配,用的是类的非静态方法 matcher,返回的结果是 Matcher对象
Matcherm=p.matcher(str);
步骤3使用Matcher类的方法find查找,95); font-family:宋体; font-size:12pt">返回boolean类型值
System.out.println(m.find());
System.out.println(m.group());
// System.out.println(m.start()+"..."+m.end())可以和m.group的效果相同
二、反射
由来:使用户不需要改动源程序就可以改变程序运行效果(扩展程序)。
应用:JavaWeb android底层实现原理有是反射原理。
含义:对一个类的class文件进行解刨,直接从class文件,获取方法并运行
java.lang.Class对class对象进行描述的类。
构造方法。也被看成是对象有构造方法的表述类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对象才会运行)。主推第三种方法
开始进行解剖这个文件
私有构造方法,带参数的构造(day27_exercise里面的源程序其中两个public类型的一个空参一个带有两个参数int和string)
public staticvoidmain(String[] args) throws Exception {
Classc1=Class.forName("Fs.Person");
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()
//运行构造方法,在描述构造方法的类。 newInstance(Object... initargs)参数:调用构造方法的时候传递的
Objectobj=con1.newInstance();
System.out.println(obj);结果空参数的构造方法
Constructorcon2=c1.getConstructor(String.class,int.class);
System.out.println(con2);
obj=con2.newInstance("余猛",24); //运行构造方法,赋值。
//Person余猛...24null
// Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes) 获取单个
// Constructor[]<T>getDeclaredConstructors(Class<?>... parameterTypes) 获取所有构造方法共有、私有、默认等。
Constructorcon3=c1.getDeclaredConstructor(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);
}
注意区分Constructors和Constructor的区别,以及getDeclaredConstructors和getDeclaredConstructor的区别
Field f2=c1.getDeclaredField("name");获取私有的成员变量
Fieldf3=c1.getDeclaredField("age");
Fieldf4=c1.getField("address");获取公共的成员变量
Objectobj=c1.newInstance();
f2.setAccessible(对私有成员变量跳过检查
f3.setAccessible(true);
对成员变量赋值
f2.set(obj,255); font-family:Consolas; font-size:12pt">");
f3.set(obj,25);
f4.set(obj,255); font-family:宋体; font-size:12pt">武汉");
System.out.println(obj);//运行结果:空参数的构造方法 Person余猛...25武汉
//获取成员变量getField,getFields以及//getDeclaredFields,getDeclaredField和构造方法是用类似
Class c1=Class.forName("Fs.Person");
Methodm=c1.getMethod("show");
Methodm1=c1.getDeclaredMethod("method",85); font-family:Consolas; font-size:12pt">class);注意格式括号里面第一个是方法名第二个是方法参数
Objectobj=c1.newInstance();
m.invoke(obj);
m1.setAccessible(true);
m1.invoke(obj,3223);
运行结果
空参数的构造方法
show方法公共权限
method方法私有权限,带有一个参数3223