动态代理

    动态代理:是实现增强类中的一种方式,jdk中的动态代理:Proxy对象,使用最广泛的是在AOP切面编程中。

实现一个简单的动态代理来了解其中的运行机制。

    创建一个接口:Person类型的接口   

 public interface   Person{
public abstract void eat();
   public abstract void sleep();
public abstract String getName();
}

   创建一个类(Student)来实现Person接口

public class Student implements Person{
private String name;
public Student(String name) {
this.name=name;
}
@Override
public void eat() {
System.out.println("吃串串"); }
@Override
public void sleep() {
System.out.println("正在睡觉...."); }
@Override
public String getName() {
return name;
}
}

  为了在学生吃串串前来杯啤酒我们需要来增强Student

    三种方式:

        1.继承

        2.装饰类

        3.动态代理

  这里使用动态代理类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class ProxyStudent implements InvocationHandler { private Person p; public ProxyStudent(Person p) {
this.p=p;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("吃炸鸡");
p.eat();
          String name=p.getName();
System.out.println("喝啤酒");
return name;
}
}

  测试类:

import java.lang.reflect.Proxy;

public class TestDemo {
public static void main(String[] args) {
Person p=new Student();
Person ps=(Person) Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(), new ProxyStudent(p));
ps.eat();
          String name=ps.getName();
          System.out.println(name);
  }
}

  输出结果:

吃炸鸡
吃串串
喝啤酒
吃炸鸡
吃串串
喝啤酒
张三

  这个动态类不是特别灵活,我们进一步修改代理类

我们需要知道其中的三个参数(Object proxy, Method method, Object[] args)

    参数一:proxy:动态代理对象

    参数二:method:表示需要执行的方法

    参数三:args:表示执行方法参数

 

package com.baidu;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class ProxyStudent implements InvocationHandler { private Person p; public ProxyStudent(Person p) {
this.p=p;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("吃炸鸡");
Object object = method.invoke(p, args);
System.out.println("喝啤酒");
return object;
}
}

  如果我们需要在某个特殊方法进行增强我们可以判断它执行的方法;

  只在吃串串前进行增强

package com.baidu;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class ProxyStudent implements InvocationHandler { private Person p; public ProxyStudent(Person p) {
this.p=p;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if ("eat".equalsIgnoreCase(method.getName())) {
System.out.println("吃炸鸡");
method.invoke(p, args);
System.out.println("喝啤酒");
return null;
}
Object object = method.invoke(p, args);
return object;
}
}

  输出结果:

吃炸鸡
吃串串
喝啤酒
张三

    

    

day36(动态代理)的更多相关文章

  1. JDK动态代理

    一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...

  2. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  3. java动态代理的2种实现方式

    java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...

  4. JDK动态代理实现原理

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...

  5. java中动态代理的实现

    动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...

  6. 静态代理和利用反射形成的动态代理(JDK动态代理)

    代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...

  7. Java动态代理

    代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  8. Java 动态代理机制详解

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

  9. 静态代理&动态代理

    原文地址:http://blog.csdn.net/partner4java/article/details/7048879 静态AOP和动态AOP. 静态代理: 代理对象与被代理对象必须实现同一个接 ...

随机推荐

  1. Json解析数据

    Json数据解析(重点网址推荐:www.json.org   code.google.com/   https://www.json.com/) 1:什么是Json? 2:Json数据格式的特点? 3 ...

  2. ROS安装

    本文参考地址:http://ros.exbot.net/wiki/cn(2f)indigo(2f)Installation(2f)Ubuntu.html http://wiki.ros.org/ind ...

  3. uva 103(最长递增子序列) Stacking Boxes

    大意是有一些n维的物体,他的边也是n条,如果将一个物体的边按任意顺序排列,只要有一种排列满足一一对应小于另一物体的边,就可以将这个物体嵌套进去另一个物体中,文最多能连续嵌套几个物体. 所求的最多的连续 ...

  4. MacDev.GetArchOfLibrary

    1. static library How to check target architecture of a static library http://changhoward.blogspot.c ...

  5. java1.8 版本改成 java1.7版本

    以前先安装的java1.7 大部分程序应该都是只支持1.7 不支持1.8 但是因为要跑一个别人的项目 要求是java1.8 所以想在电脑上同时装1.7和1.8 到官网上下载1.8 安装 安装完成后 并 ...

  6. Convert 实现 pdf 和图片格式互转

    pdf 转换为图片 (注意:pdf 默认转换的是透明背景,如果转为jpg格式必须添加背景色.-background white -flatten) convert -background white ...

  7. ubuntu 配置ftp server(zz)

    ubuntu 配置 ftp server   安装vsftpd sudo apt-get install vsftpd # vsftp(Very Secure FTP)是一种在Unix/Linux中非 ...

  8. 【算法】DP解决旅行路径问题

    问题描述 : After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice ...

  9. 自定义注解与validation结合使用案例

    编写validation自定义注解: @Target({ ElementType.FIELD, ElementType.METHOD })@Retention(RetentionPolicy.RUNT ...

  10. GC收集器种类

    转载:https://wangkang007.gitbooks.io/jvm/content/la_ji_shou_ji_qi.html 收集器 1.1 Serial(串行)收集器 Serial收集器 ...