正则表达式和反射
正则表达式和反射 一、正则 进行复杂字符串的处理时使用String,Buffer这些类远远不够于是并有了正则表达式
调用方式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);
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()); 获取查找结果用对象的方法group 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对象才会运行)。主推第三种方法
开始进行解剖这个文件 一、获取class文件对象 获取构造方法,并运行 私有构造方法,带参数的构造(day27_exercise里面的源程序其中两个public类型的一个空参一个带有两个参数int和string) public staticvoidmain(String[] args) throws Exception { 首先获取class文件对象 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); //运行构造方法,赋值。 System.输出结果:有String和类的构造方法 //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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |