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. Omi框架学习之旅 - 组件通讯(data通讯) 及原理说明

    接着上一篇的data-*通讯,这篇写data通讯. data通讯主要为了复杂的数据通讯. 老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. class Hello exten ...

  2. 数据库隔离级别深入理解(ORACLE)

    TRANSACTION_READ_UNCOMMITTED 1 这种隔离级别最低,脏读,不可重复读,幻读都会发生,我用的oracle,并没有支持这个级别,不作研究. TRANSACTION_READ_C ...

  3. linux中断源码分析 - 概述(一)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 关于中断和异常 一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方.在CPU里,中断 ...

  4. u-boot全面分析

    uboot主Makefile分析1 uboot住Makefile分析参考:https://www.2cto.com/kf/201607/522424.html uboot version确定(Make ...

  5. ${pageContext.request.contextPath}的作用【转载】

    原文地址:http://ps329795485-126-com.iteye.com/blog/1290662 刚开始不知道是怎么回事,在网上也查找了一些资料,看了还是晕. 看了另一个大侠的,终于有了点 ...

  6. Mac安装使用MongoDB

    Mac 下安装 MongoDB 一般有两种方法,一种是通过源码安装,一种是直接使用 homebrew ,个人推荐使用 homebrew ,简单粗暴. 一.安装 homebrew : /usr/bin/ ...

  7. SpringMVC之声明式校验

    1.在http://www.cnblogs.com/wtzl/p/8830678.html编程式校验基础上 2.新增jar包三个 3.StudentModel.java(声明式) package 声明 ...

  8. How to Enable TLS 1.2 on Windows Server 2008 R2 and IIS 7.5

    Nowadays there is an SSL vulnerability called POODLE discovered by Google team in SSLv3 protocol. So ...

  9. CentOS搭建NAT和DHCP服务,实现共享上网

    什么是NAT? NAT(Network address translation)即网络地址转换,作为一种过渡解决手段,可以用来减少对全球合法IP地址的需求.简单的说,NAT就是在内部专用网络中使用内部 ...

  10. Express4.x API (三):Response (译)

    Express4.x API 译文 系列文章 Express4.x API (一):application (译) -- 完成 Express4.x API (二):request (译) -- 完成 ...