-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方法。
用的是字符串里面的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());//返回匹配前初始索引,返回匹配后结束索引
P
attern类为正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建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. }