15.1  动态代理
        在之后学习Spring框架时,Spring框架有一大核心思想,就是AOP,(Aspact-Oriented-Programming 面向切面编程) 而AOP的原理就是Java的动态代理机制,在Java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的
15.1.1 动态代理的基础
动态代理的基础 : 必须有接口
Java中使用接口来定义统一的行为规范 : 接口.

接口必须有实现类:
interface SuperStar 超级明星
行为规范 :
void sing(int money);
void liveShow(int moeny);
void sleep();

// 接口必须有实现类 :
1. L implements SuperStar
2. B implements SuperStar
Proxy 代理类 :

Class Proxy 代理类 是在运行时创建的实现指定的接口列表(称为代理接口)的类 。 代理实例是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序对象,它实现接口InvocationHandler 。 通过其代理接口之一的代理实例上的方法调用将被分派到实例调用处理程序的invoke方法

static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 返回指定接口的代理实例,该代理实例将方法调用分派给指定的调用处理程序。

15.1.2 动态代理作用:   
         拦截和控制 被代理对象 的所有行为
15.1.3 InvocationHandler 调用处理器
        Interface InvocationHandler 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。

15.1.4 案例

15.2  XML
简介 : XML全称为Extensible Markup Language,意思是可扩展的标记语言。

标记 -> 用标记来修饰文本信息.
    
    可扩展 -> 标记可随意定义.

XML技术 : 与数据相关技术, 在企业中xml技术常用来存储数据和传输数据, xml之所以流行的原因在于xml语言与任何编程语言无关, xml可用于 php, java, .net任何编程语言.

15.2.1 书写一个xml配置文件
            xml编写时也要符合一定的规则 :
1)xml文件的后缀名是.xml
2)xml有且只有一个根标签
3)xml的标签是尖括号包裹关键字成对出现的,有开始标签有结束标签,关键字是自定义的, xml也可以有空标签/自关闭标签
4)xml允许有属性,属性也是根据需要自定义的,属性格式:属性= "属性值",多个属性之间使用空格隔开
5)xml是区分大小写的
            xml 的组成
1)文档声明:<?xml version="1.0" encoding="UTF-8" ?>

2)根标签,例如: <store>

3)其他标签,例如:<name>

4)属性,例如:category="手机数码"

5)文本,例如:华为手机

6)注释,例如:<!-- 这是xml文档的根标签 -->

15.2.2 约束介绍 DTD ,Schema

15.2.3 xml 解析:

XML的实际应用场景 :

实际开发中,我们一般会使用各种各样的框架进行企业开发,而这些框架一般都会将某些公共的功能都已经写好,我们需要做的只需要按照框架提供的约束进行框架的配置就可以了,当我们使用XML配置好框架后,再运行时,框架底层会解析我们配置XML文档获取有用的信息,从而根据我们的需求实现某些功能。

所以,实际开发中我们很少会自己编写XML约束和解析XML.

@Test
   public void test1() throws DocumentException {

       // 1. 创建一个 saxReader 解析器
       SAXReader saxReader = new SAXReader();
       // 2. 调用 read 方法读取 xml 配置文件, 并获取一个 document 对象
       Document document = saxReader.read("books.xml");
       // 3. 调用 getRootElement 方法, 获取根标签对象
       Element root = document.getRootElement();
       // 4. 调用 elements 方法, 获取子标签数组
       List<Element> bookElements = root.elements();
       // 5. 遍历 bookElements 数组
       for (Element book : bookElements) {
           // 6. 调用 attributeValue 方法, 传入属性名称, 获取对应的属性值
           String author = book.attributeValue("author");
           System.out.println("author = " + author);

           // 7. 获取子标签
           List<Element> elements = book.elements();
           // 8. 遍历子标签
           for (Element e : elements) {
               // 9. 获取标签名称, 和标签体数据
               String name = e.getName();
               String text = e.getText();
               System.out.println(name + " = " + text);
          }
      }
  }

输出结果 :
author = 张三丰
name = Java从入门到精通
price = 98
author = 灭绝师太
name = Java编程思想
price = 998
   @Test
   public void test2() throws DocumentException {
       // 1. 创建一个 saxReader 解析器
       SAXReader saxReader = new SAXReader();
       // 2. 调用 read 方法读取 xml 配置文件, 并获取一个 document 对象
       Document document = saxReader.read("beans.xml");
       // 3. 调用 getRootElement 方法, 获取根标签对象
       Element root = document.getRootElement();
       // 4. 调用 elements 方法, 获取子标签数组
       List<Element> beanElements = root.elements();
       // 5. 调用 elements 方法, 获取子标签数组
       for (Element bean : beanElements) {
           // 6. 调用 attributeValue 方法, 传入属性名称, 获取对应的属性值
           String id = bean.attributeValue("id");
           String className = bean.attributeValue("className");
           System.out.println(id + " = " + className);
           // 7. 调用 elements 方法, 获取子标签数组
           List<Element> propElements = bean.elements();
           // 8. 调用 propElements 方法, 获取子标签数组
           for (Element prop : propElements) {
               // 9. 调用 attributeValue 方法, 传入属性名称, 获取对应的属性值
               String name = prop.attributeValue("name");
               String value = prop.attributeValue("value");
               System.out.println(name + " = " + value);
          }
      }
  }

输出结果 :
001 = cn.itcast.bean.User
username = ZhangSan
password = 123456
002 = cn.itcast.bean.User
username = LiSi
password = 654321

15.3  正则表达式

15.3.1 正则概念
            egular Expression 正则表达式 : 在Java中, 正则主要使用在 String 类的方法参数为 regex 的名称上
            
 String 类的三个带 regex 参数的方法 :
split(String regex) 切割.
matches(String regex) 匹配.
replaceAll(String regex, String replacement) 替换.

15.3.2 符号介绍
1. [] 取值的范围. 0-9 数值0到9都成立.
        说明 : [0-9] 可以使用 \\d 表示
2. {} 表示前一个条件中 `值 / 字符` 可以出现的次数.
 说明 : {4,11} 至少4次, 最多11次.
    {0,1} 至少0次,最多一次. 可以使用 ? 表示.
    {1,} 至少1次,最多无限次 可以使用 + 表示.
    {0,} 至少0次,最多无限次. 可以使用 * 表示.
3. () 表示分组. 在replaceAll方法的第二个参数上可以使用 $ 符号来引用之前的分组,分组编号自动从1开始.

15.3.3 案例
                    
public class ReplaceAllTest4 {
   public static void main(String[] args) {

       // 13311111946 -> 133****1946

       String phone = "13311111946";

       /*
          源数据 : 13311111946
          第一部分 : 133     规则一 : 1[34578]\\d
          第二部分 : 1111     规则二 : \\d{4}
          第三部分 : 1946     规则三 : \\d{4}
        */

       String result = phone.replaceAll("(1[34578]\\d)(\\d{4})(\\d{4})", "$1****$3");
       System.out.println("result = " + result);
  }
}

输出结果 :
result = 133****1946

Java动态代理、XML、正则的更多相关文章

  1. AOP面向切面编程JAVA动态代理实现用户权限管理(实现篇)

    java动态代理机制的功能十分强大,使用动态代理技术能够有效的降低应用中各个对象之间的耦合紧密程度,提高开发的效率以及程序的可维护性,事实上Spring AOP就是建立在Java动态代理的基础之上.其 ...

  2. Java动态代理-->Spring AOP

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Jav ...

  3. 初看Mybatis 源码 (二) Java动态代理类

    先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢? ...

  4. java动态代理框架

             java动态代理是一个挺有意思的东西,他有时候可以被使用的很灵活.像rpc的调用,调用方只是定义的一个接口,动态代理让他匹配上对应的不同接口:mybatis内部的实现,编码时,只是实 ...

  5. Java 动态代理原理图解 (附:2种实现方式详细对比)

    ​ 动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 ...

  6. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  7. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  8. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  9. Java 动态代理作用是什么?

    Java 动态代理作用是什么?   1 条评论 分享   默认排序按时间排序 19 个回答 133赞同反对,不会显示你的姓名 Intopass 程序员,近期沉迷于动漫ING 133 人赞同 ① 首先你 ...

  10. java动态代理原理

    我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...

随机推荐

  1. 【Codeforces Round 1137】Codeforces #545 (Div. 1)

    Codeforces Round 1137 这场比赛做了\(A\).\(B\),排名\(376\). 主要是\(A\)题做的时间又长又交了两次\(wa4\)的. 这两次错误的提交是因为我第一开始想的求 ...

  2. Luogu P2661 [NOIP2015] 信息传递

    qwq 今天做完并查集突然想起来这道以前做的好(shui)题, 虽然是黄题,但是是并查集一个比较特别的用法 这道题大概可以用求最小环的方式来做,但是从直觉上果然还是并查集w 乍一看只要求出“父→子”即 ...

  3. luogu P1439 【模板】最长公共子序列(LCS)

    题目qwq (第一道蓝题) 先把第一个序列每个数出现的顺序记下来(数字本身不用记), 然后第二个序列的每个数都对照它的顺序,这样只要得到一个升序的序列就行了qwq 如果遇到出现顺序在前面的数,就用二分 ...

  4. three.js - 添加材质 灯光 阴影

    看下运行效果: 源码解释: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. STL语法——集合:set 安迪的第一个字典(Andy's First Dictionary,UVa 10815)

    Description Andy, , has a dream - he wants to produce his very own dictionary. This is not an easy t ...

  6. Tensorflow[架构流程]

    1. tensorflow工作流程 如官网所示: 根据整体架构或者代码功能可以分为: 图1.1 tensorflow架构 如图所示,一层C的api接口将底层的核运行时部分与顶层的多语言接口分离开. 而 ...

  7. 有哪些操作会使用到TempDB;如果TempDB异常变大,可能的原因是什么,该如何处理(转载)

    有哪些操作会使用到TempDB:如果TempDB异常变大,可能的原因是什么,该如何处理:tempdb的用途: 存储专用和全局临时变量,不考虑数据库上下文: 与Order by 子句,游标,Group ...

  8. Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开

    传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...

  9. 非关系型数据库(nosql)介绍

    非关系型数据库也叫Nosql数据库,全称是not noly sql. 2009年初,Johan Oskarsson举办了一场关于开源分布式数据库的讨论,Eric Evans在这次讨论中提出了NoSQL ...

  10. JVM规范系列第3章:为Java虚拟机编译

    Oracle 的 JDK 包括两部分内容:一部分是将 Java 源代码编译成 Java 虚拟机的指令集的编译器,另一部分是用于Java 虚拟机的运行时环境. 第一部分应该说的是 Javac 这个前置编 ...