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

 ----------------- 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){
			System.out.println(i.replaceAll("0*(\\d+)", "$1"));
		}

  


 
  
  
  
  
  









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值