代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。 举例:春季回家买票让人代买 动态代理:在程序运行过程中产生的这个对象 而程序运行过程中产生对象其实就是反射 所以,动态代理其实就是通过反射来生成一个代理
// Goods 接口,增删改查 public interface Goods { public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void select(); }
// Goods 接口实现类 public class GoodsImp implements Goods { @Override public void add() { System.out.println("增加用户数据"); } @Override public void delete() { System.out.println("删除用户数据"); } @Override public void update() { System.out.println("更新用户数据"); } @Override public void select() { System.out.println("查询用户数据"); } }
public class MyInvocation implements InvocationHandler { private Object proxy; public MyInvocation(Object obj){ this.proxy = obj; } @Override public Object invoke(Object proxy, Method method , Object[] args) throws Throwable { System.out.println("权限校验"); // 反射调用方法 Object result = method.invoke(this.proxy, args); System.out.println("日志记录"); return result; } }
// 主程序 public class DynamicAgent { public static void main(String[] args) { GoodsImp good = new GoodsImp(); //动态代理 //我们需要先创建一个动态代理对象 //public static Object newProxyInstance(ClassLoader loader, // 类<?>[] interfaces, // InvocationHandler h) //throws IllegalArgumentException返回指定接口的代理类的实例, //该接口将方法调用分派给指定的调用处理程序 Object o = Proxy.newProxyInstance(good.getClass().getClassLoader() , good.getClass().getInterfaces() , new MyInvocation(good)); Goods g = (Goods) o; System.out.println(o.getClass()); System.out.println(g.getClass()); g.add(); System.out.println("-----------------"); g.delete(); System.out.println("-----------------"); g.select(); System.out.println("-----------------"); g.update(); } }
运行结果:
class com.sun.proxy.$Proxy0 class com.sun.proxy.$Proxy0 权限校验 增加用户数据 日志记录 ----------------- 权限校验 删除用户数据 日志记录 ...
/* 原义字符 */ public class Regular2 { public static void main(String[] args) { String regex = "a"; String s = "abajbgakjabsfgababccaaaa"; System.out.println(s.replaceAll(regex,"_")); } }
输出结果
_b_jbg_kj_bsfg_b_bcc____
/* 元字符 字符类 */ public class Regular3 { public static void main(String[] args) { // 定义规则 // 只要字符串中出现了abc中的任意一个都会匹配到并替换 // []将字符进行归类,可以出现括号中的任意一个字符进行匹配 String regex = "[abc]"; // 反选 String regex2 = "[^abc]"; String s = "abajbgakjabsfgababccaaaa"; System.out.println(s); System.out.println(s.replaceAll(regex,"_")); System.out.println(s.replaceAll(regex2,"_")); } }
输出结果
abajbgakjabsfgababccaaaa ___j_g_kj__sfg__________ aba_b_a__ab___ababccaaaa
/* 元字符 范围类 */ public class Regular4 { public static void main(String[] args) { // a 到 z 小写 String regex = "[a-z]"; // a 到 z 大、小写 String regex2 = "[A-z]"; // a 到 z 小写 和 4 String regex3 = "[a-z4]"; String s = "ASisf3446ajskdZfg345aht"; System.out.println(s); System.out.println(s.replaceAll(regex,"_")); System.out.println(s.replaceAll(regex2,"_")); System.out.println(s.replaceAll(regex3,"_")); } }
输出结果
ASisf3446ajskdZfg345aht AS___3446_____Z__345___ _____3446________345___ AS___3__6_____Z__3_5___
/* 元字符: 预定义类: \d == [0-9] 数字 \D == [^0-9] 非数字 空白字符:[\t\n\x0B\f\r] == \s [^ \t\n\x0B\f\r] == \S \w == [a-zA-Z0-9] \W == [^a-zA-Z0-9] . 任何字符(与行结束符可能匹配也可能不匹配) */ public class Regular5 { public static void main(String[] args) { String regex = null; String s = "abc12323 124ad aqw&;1234.AB"; regex = "\\d"; // 数字 System.out.println(s.replaceAll(regex,"_")); regex = "\\D"; // 数字之外 System.out.println(s.replaceAll(regex,"_")); regex = "\\s"; // 空白字符 空格 System.out.println(s.replaceAll(regex,"_")); regex = "\\S"; // 除空白字符外 System.out.println(s.replaceAll(regex,"_")); regex = "\\w"; // 大小写字母及数字 System.out.println(s.replaceAll(regex,"_")); regex = "\\W"; // 大小写字母及数字 System.out.println(s.replaceAll(regex,"_")); //如果仅仅是想要匹配.这个字符 //需要用\进行转义 "\\." regex = "."; System.out.println(s.replaceAll(regex,"_")); } }
输出结果
abc12323 124ad aqw&;1234.AB abc_____ ___ad aqw&;____.AB ___12323_124________1234___ abc12323_124ad_aqw&;1234.AB ________ _____ ____________ ________ _____ ___&;____.__ abc12323_124ad_aqw__1234_AB ___________________________
/* 边界字符: ^:以xxx开头 $:以xxx结尾 \b:单词边界 \B:非单词边界 */ public class Regular6 { public static void main(String[] args) { //这里没有中括号,^代表以什么开头 String regex = "^abc"; //定义要被匹配的字符串 String s = "abc12323 124ad aqw&;1234.AB"; System.out.println(s.replaceAll(regex,"_")); regex = "AB$"; //表示以AB结尾 System.out.println(s.replaceAll(regex,"_")); // 字符,数字,连在一起时会公用下划线分开 s = "Hello World666 1 2 3 &1;0 0 a b s f"; s = "1&1"; regex = "\\b"; //匹配单词的两边 System.out.println(s.replaceAll(regex,"_")); regex = "\\B"; //匹配单词之间 System.out.println(s.replaceAll(regex,"_")); } }
输出结果
_12323 124ad aqw&;1234.AB abc12323 124ad aqw&;1234._ _1_&_1_ 1&1
/* 量词类: ?:出现0次或者1次 +:出现1次或者多次 *:出现任意次 {n}:出现正好n次 {n,m}:出现n-m次 {n,}出现至少n次 */ public class Regular7 { public static void main(String[] args) { // 只看@出现的次数 String regex = "abc@?"; String s = "abcdfjabc@@1babc@"; System.out.println(s.replaceAll(regex,"_")); //定义一个规则 regex = "^a?"; //匹配以a开头,只匹配0次或者1次 s = "aaaaaabcdefg"; System.out.println(s.replaceAll(regex,"_")); regex = "^a+"; //匹配以a开头,匹配1次或者多次为一组,进行替换 System.out.println(s.replaceAll(regex,"_")); regex = "^a*"; //匹配以a开头,匹配任意次为一组,进行替换 System.out.println(s.replaceAll(regex,"_")); regex = "^a{3}"; //匹配以a开头,匹配3个为一组,进行替换 System.out.println(s.replaceAll(regex,"_")); regex = "^a{7,10}"; //匹配以a开头,匹配7到10个为一组,进行替换 System.out.println(s.replaceAll(regex,"_")); regex = "^a{3,}"; //匹配以a开头,匹配3个以上为一组,进行替换 System.out.println(s.replaceAll(regex,"_")); } }
输出结果
abcdfjabc@@1babc@ _dfj_@1b_ _aaaaabcdefg _bcdefg _bcdefg _aaabcdefg aaaaaabcdefg _bcdefg
/* 元字符: 分组: () */ public class Regular8 { public static void main(String[] args) { //分组 //定义规则 String regex = "ABC{3,}"; //匹配AB以及包含3个以上的C为一组 String s = "abcccccABCCC12AabcABCxiaohuaCCCCCabcabcabc123"; System.out.println(s.replaceAll(regex,"_")); regex = "(abc){3,}"; //匹配abc为一组出现了3次以上进行替换 System.out.println(s.replaceAll(regex,"_")); regex = "ABC(123|abc|xiaohua){1,}"; //匹配ABC为一组一组后出现上述任意内容的进行替换 System.out.println(s.replaceAll(regex,"_")); } }
输出结果
abcccccABCCC12AabcABCxiaohuaCCCCCabcabcabc123 abccccc_12AabcABCxiaohuaCCCCCabcabcabc123 abcccccABCCC12AabcABCxiaohuaCCCCC_123 abcccccABCCC12Aabc_CCCCCabcabcabc123
/* 反向引用: $ */ public class Regular9 { public static void main(String[] args) { //2021-10-28 --> 10/28/2021 //定义规则 String regex = "(\\d{4})-(\\d{2})-(\\d{2})"; String s = "2021-10-28"; System.out.println(s.replaceAll(regex,"$2/$3/$1")); //我现在不想要生成分组编号,怎么办呢? 可以通过?:实现 regex = "(\\d{4})-(?:\\d{2})-(\\d{2})"; System.out.println(s.replaceAll(regex,"$2/$2/$1")); } }
输出结果
10/28/2021 28/28/2021
/* 验证手机号码: 1、手机号码都是11位,并且都是以1开头 2、其余都是由数字组成 验证邮箱是否符合: 1、由数字字母@数字或者字母.com组成 */ public class test1 { public static void main(String[] args) { //Test1 //定义规则 String regex = "^1\\d{10}"; String phoneNum = "17353142512"; boolean matches = phoneNum.matches(regex); System.out.println(matches); //Test2 //定义规则 String regex2 = "\\w+@\\w+\\.com"; String emailNum = "116587fdv2335@qdfsq.com"; boolean matches1 = emailNum.matches(regex2); System.out.println(matches1); } }