反射与正则
1.给一个ArrayList<Integer>集合中添加一个字符串数据,并显示
* 思路:1,获取这个集合的字节码对象 然后通过Class对象获取该集合对象.
* 2.再用Class对象获取集合的add方法对象Method
* 3.再把class对象与添加的字符串当参数传给Method的方法invoke.
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>();
Class<?> cls = list.getClass();
ArrayList<Integer> obj =(ArrayList)cls.newInstance();
Method mt = cls.getMethod("add",Object.class);
mt.invoke(obj, "String");
//obj.add("String");这样则无法编译通过
System.out.println(obj);
}
}
2. 通过配置文件运行类中的方法
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/*
* 思路:
* 1,先将文件写入字节流,然后将字节流写入Properties集合中
* 2,通过getProperties方法获取方法名和类名
* 3,再通过类名获取其class对象
* 4.通过对象和方法名获取其方法
*/
public class Test {
public static void main(String[] args) throws Exception{
FileInputStream file = new FileInputStream("Show.txt");
Properties pro = new Properties();
pro.load(file);
file.close();
//通过键值对获取对应的类名和方法名
String className = pro.getProperty("className");
String methodName= pro.getProperty("methodName");
//通过反射获得字节码对象和方法对象
Class<?> cls = Class.forName(className);
Object obj =cls.newInstance();
Method mt = cls.getMethod(methodName,null);//方法一定要公用public
//如果是getDeclaredMethod,则也可以获取非公有方法
//如果方法私用,那么要先暴力破解:mt.setAccessible(true);
mt.invoke(obj,null);
}
}
3.随即输入QQ号:校验QQ号码:不能以0开头 是5-15位的数字
import java.util.Scanner;
* * 思路:用正则定义规范,再用String类的匹配方法match方法判断时否正确
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String qq = sc.nextLine();
String segex ="[^0][0-9]{4,14}";
boolean flag= qq.matches(segex);
if (flag) {
System.out.println(qq);
}else{
System.out.println("输入格式错误");
}
4. 邮件校验
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+";
//用\w改写规则\w表示:单词字符:[a-zA-Z_0-9]
//反斜杠\\的用法:当在字符串中,\表示转义,所以要表示明确意思要用两个反斜杠
String regex = "\\w+@\\w+(\\.\\w+)+";
boolean flag = eamil.matches(regex);
System.out.println(flag);
5.将字符串还原成:“我要学编程”。如:我...我.要....
String s = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
String regex = "\\.+";//先把点去掉
s=s.replaceAll(regex, "");
System.out.println(s);
s=s.replaceAll("(.)\\1+", "$1");//再去叠词,注意:这里$1表示前面(.)\\1内的值,也就是任意值.()是组意思
System.out.println(s);
6.能将这些ip地址排序。按照地址段数值从小到大排序。
"192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34"
思路:
* ip地址都是字符串,所有字符串排序,用TreeSet。
* 如果用TreeSet现在存在每个ip地址,就会有问题。因为有部分ip没有满足三位。
* 这样比较是有问题的, 所有,我们采取补位的方式。
* 1:先给每个ip地址的每一个位在前面补2个0。
* 2:把超出3位的数据,截取成3位。
*/
public class Test {
public static void main(String[] args) {
String str = "192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34";
// 先补2个0
str = str.replaceAll("(\\d+)", "00$1");
System.out.println(str);
// 去除超出3位的前面的0
str = str.replaceAll("0*(\\d{3})", "$1");
System.out.println(str);
// 切割
String[] ips = str.split(" ");
// 我遍历这个字符串数组,把每个数据添加到TreeSet集合中。
TreeSet<String> ts = new TreeSet<String>();
for (String s : ips) {
ts.add(s);
// System.out.println(s);
}
//System.out.println(ts);
//最后遍历集合,把前面的0干掉
for(String s : ts){
s = s.replaceAll("0*(\\d+)", "$1");
|
|