黑马程序员————java基础之反射和正则

来源:互联网 发布:好书推荐 大数据 编辑:程序博客网 时间:2024/05/19 21:16

-Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

反射

java反射是在运行过程中,对于任意一个类都能知道这个类的所以属性和方法,对于任意一个类都能调用他的属性和方法,这种动态获取信息和调用对象方法的功能在java中叫做反射。

用于描述字节码的类就是Class类,创建对象,可以提取字节码文件中的内容。想要对一个类文件进行解剖,只要获取到该类的字节码文件对象即可。
获取字节码文件的3中方式

(1)用Object类中的getClass方法,不过要明确具体的类

<span style="font-family:SimSun;font-size:12px;">Person p = new Person();Class clazz = p.getClass();</span>
(2)任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。
<span style="font-family:SimSun;font-size:12px;">Class clazz=Person.class</span>
(3)通过给定字符串的名称,调用class类中的forName。

String str ="cn.itcast.bean.Person";Class clazz =Class.forName(str);
调用类的构造函数

Object obj =Clazz.newInstance
当对象不是使用空参构造函数,通过指定的构造函数初始化,我们要先获取该构造函数getConstructor(parameterTypes);

Constructor c =class.getConstructor(int.class,String.class);//通过该构造器对象的newInstance方法进行对象的初始化。 Object obj = constructor.newInstance(31,"小红");
获取字节码文件中字段
getField只能获取所有可访问公共字段,private获取不到。
Field field = claszz.getField("age");//getDeclaredField可以获取到公共字段,也可以获取到私有字段。 Field field = clazz.getDeclaredField("age"); //对私有字段的访问取消权限检查,暴力访问。 field.setAccessible(true); Object obj = clazz.newInstance();为对象的属性赋值 field.set(obj,89); //获取某对象的某属性值 Object o = field.get(obj);
获取字节码文件的方法

Method[] methods = clazz.getMethods();//获取的都是公有的方法 methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包括私有。
Method method = clazz.getMethod("show",null);//获取空参数一般方法

正则

正则表达式用于操作字符串数据;通过一些特定符号表现
正则表达式常用构造摘要
字符类
[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 输入的结尾

正则表达式对字符串的常见操作
 1.匹配
 其实使用的就是String类中的matches方法。
[]里面写的就是满足要求的字符,一个[]代表一个;{}里面写的是前一个[]的次数
正则的数字"\d"应该写成"\\d"。

2.切割
 其实使用的就是String类中的split方法。

对于多空格的切割可以使用” +“;的方式。
对于点再字符中是应该用”\\."来切割。
()在正则中叫组是对里面字符的封装(.)\\1,(.)是第一组,\\1 表示第二个位置还用第一组
3.替换

用的是字符串里面的replaceAll

在一个方法里面的两个参数,第二个参数想使用第一个参数里面内容可以用$


// \\b表示单词边界 String regex = "\\b[a-z]{3}\\b";//1. 将正则封装成对象 Pattern p = Pattern.compile(regex); //2. 通过正则对象获取匹配器对象Matcher m = p.match(str) //使用Matcher对象的方法对字符串进行操作。 //既然要获取三个字母组成的单词。 //查找:find(); while(m.find()){ System.out.println(m.group());//获取匹配的子序列.System.out.println(m.start()+";"+m.end());//返回匹配前初始索引,返回匹配后结束索引
Pattern类为正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实
例。然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹
配。
练习:ip地址排序
192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
思路:对于每一个lp段都给他加上两个零,然后再保留3个数字,通过切割切成几段,创建Treeset结合,将切出的元素存入结合中,然后在替换成原来形态输出

public class RegexTest { public static void main(String[] args){show();1public static void show(){String ip= "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";ip = ip.replaceAll("(\\d+)","00$1");22. System.out.println(ip);23.24. //然后每一段保留数字3位。25. ip = ip.replaceAll("0*(\\d{3})","$1");26. System.out.println(ip);27.28. //1. 将ip地址切出。29. String[] ips = ip.split(" +");30.31. TreeSet<String> ts = new TreeSet<String>();32.33. for(String ips : ip){34. ts.add(ips);35. }36.37. for(String ip : ts){38. System.out.println(ips.replaceAll("0*(\\d+)","$1"));39. }40. }41. }



















0 0