您的位置:首页 > 职场人生

黑马程序员_反射技术和正则表达式

2013-09-24 10:29 681 查看
 -----------------
android培训、java培训、期待与您交流! ----------

如何获取Class对象呢?

方式一:


 通过对象的getClass方法进行获取。
麻烦在于每次是不是都需要具体的类和该类的对象,以及调用getClass方法。

Person p = new Person();
Class clazz = p.getClass();


方式二:

任何数据类型都具备着一个静态的属性class,这个属性直接获取到该类型的对应Class对象。
比第一种简单,不用创建对象,不用调用getClass方法。
但是还是要使用具体的类,和该类中的一个静态属性class完成。 

Class clazz = Person.class;


方式三:

这种方式较为简单,只要知道的类的名称即可。
不需要使用该类,也不需要去调用具体的属性和行为。就可以获取到Class 对象了。 
这种仅知道类名就可以获取该类字节码对象的方式,更有利于扩展。

String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);


通过Class创建对象:

1,查找并加载Person.class文件进内存,并将该文件封装成Class对象。

2,在依据Class对象创建该类具体的实例。

3,调用构造函数对对象进行初始化。 

String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Object obj = clazz.newInstance();


如果指定的类中没有空参数的构造函数。或者要创建的类对象需要通过指定的构造函数进行初始化。

这时就不能使用newInstance方法了。既然要通过指定的构造函数进行对象的初始化。就必须先获取这个构造函数。

String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);

//获取指定类中的指定的构造函数。
Constructor constructor = clazz.getConstructor(String.class,int.class);

//创建对象。对象的建立都需要构造函数的初始化。 怎么创建对象可以通过构造器对象完成。
Object obj = constructor.newInstance("lisi",20);


如何获取字段,并对字段进行赋值和获取。 

String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);

//获取该类中的名称为age的字段
Field ageField = clazz.getDeclaredField("age");

//System.out.println(ageField);
//想要给该变量赋值。 必须先要有对象。

Object obj = clazz.newInstance();

//对该私有字段进行取消权限检查的能力。
ageField.setAccessible(true);//暴力访问。
ageField.set(obj, 19);

Object o = ageField.get(obj);
System.out.println(o);


访问类中的方法
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("toString", null);

//获取能调用该方法的对象。
Object obj = clazz.newInstance();
Object returnValue = method.invoke(obj, null);
System.out.println(returnValue);

String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("show", null);
method.invoke(null, null);


String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
Method method = clazz.getMethod("function", String.class,int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "haha",89);


Person类的代码:
public class Person {
private String name;
private int age;
public Person() {
super();
System.out.println("person run");

}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

public String toString() {

return name+":"+age;
}

public static void show(){
System.out.println("person static show run");
}

public void function(String a,int b){
System.out.println("person param function "+a+","+b);
}

private void prviateShow(){
System.out.println("person private show run");
}
}


正则表达式:就是用操作字符串数据的规则表达式。
规则:就是用一些符号组成,每个符号都代表着特有的含义。其实这些符号想当于对应着底层一段代码。对外提供符号是简化了操作。   
弊端:必须要先学习这些符号。符号多了,阅读性会较差。

正则表达式对字符串的常见操作:

1,匹配。
使用的是String类中的matchers方法。

2,切割。
使用的是String类中的split方法。 

3,替换。
使用的是String类中的replaceAll方法。

4,获取。
将匹配的规则的内容获取出来。
使用到正则表达式对象。Pattern

使用步骤:

先将正则表达式编译成Pattern对象。
通过Pattern对象的matcher方法获取Matcher匹配器对象。
通过匹配器对象的方法,将正则规则作用到字符串上以便于操作。

需求:对QQ号进行校验。要求:5~15 位,不能以0开头,必须是数字。

regex = "[1-9][0-9]{4,14}";

package com.itheima.regex.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo3 {
public static void main(String[] args) {
checkTel();
splitDemo();
replaceAllDemo();
getDemo();
}

public static void getDemo(){
String str = "da jia zhu yi le ,yao pai wei dian ying la !";
String reg = "\\b[a-z]{3}\\b";//三个字母组成的单词都取出来。
//正则规则被编译成Pattern对象。
Pattern p = Pattern.compile(reg);
//通过正则对象的方法matcher和字符串想关联获取匹配器对象。
Matcher m = p.matcher(str);
//使用匹配器的方法对字符串进行操作。
while(m.find()){
System.out.println(m.start()+"---"+m.group()+"----"+m.end());
}
}

//替换演示。
public static void replaceAllDemo(){
//		String str = "werqqtyuzzzio";
//		str = str.replaceAll("(.)\\1+","$1");//后一个参数可以通过$数字 引用前一个参数中的组。

String str = "15812345678";
str = str.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
System.out.println(str);
}

//切割演示,
public static  void splitDemo(){
//		String str = "23    19 -1 9 56";
//		String[] arr = str.split(" +");

//		String str = "zhangsan.lisi.wangwu";
//		String[] arr = str.split("\\.");

String str  = "werqqtyuzzzio";
String[] arr = str.split("(.)\\1+");
for(String s : arr){
System.out.println(s);
}
}

//匹配演示。对手机号码进行校验。
public static void checkTel(){
String str = "158000001111";
String reg = "1[358]\\d{9}";
boolean b = str.matches(reg);
System.out.println(str+":"+b);
}
}


192.108.90.34  10.10.10.10  5.5.5.5    30.107.100.5

对ip地址字符串中的ip地址进行排序。按照ip的分类顺序

 为了排序方便。最好让ip中的每一段都是三位,这样就可以用字典顺序进行排序了。
 给每一段进行补零的操作。
 而每一段需要的补的零又不一样多,咋办?
 干脆,都按最多的两个零补。
 然后在每一段保留最后三位。

String ip = "192.108.90.34  10.10.10.10  5.5.5.5    30.107.100.5";

ip = ip.replaceAll("(\\d+)", "00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);

String[] ips = ip.split(" +");

Arrays.sort(ips);

for(String i : ips
4000
){
System.out.println(i.replaceAll("0*(\\d+)", "$1"));
}


  

 

  

  

  

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: