动态代理

    动态代理:是实现增强类中的一种方式,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. 更改AVD默认路径

    默认情况下,安卓模拟器镜像文件会放到%userprofile%\.android下,例如当前Win7登录用户为administrator 则%userprofile%为 c:\users\admini ...

  2. Oracle_PL/SQL(3) 游标

    引言:PLSQL数据类型标量数据类型:数字类.字符类.日期类.布尔类(boolean).复合数据类型:记录(%rowtype).表.数组引用类型:REF CURSORLOB类型:BLOB.CLOB 1 ...

  3. PAT 1021 个位数统计 (15)(C++&Java&Python)

    1021 个位数统计 (15)(15 分) 给定一个k位整数N = d~k-1~*10^k-1^ + ... + d~1~*10^1^ + d~0~ (0<=d~i~<=9, i=0,.. ...

  4. PAT 1023 组个最小数 (20)(代码+思路)

    1023 组个最小数 (20)(20 分) 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5, ...

  5. 厉害了,他用PS不是P照片而是……

    今儿要介绍的主角是战斗民族的设计师 Dmitriy Glazyrin,他这个人用PS做设计有个特点,专门P3D软件做出来的白模. 大家可以想象一下,一个什么颜色什么材质都没有的东西,把它楞是用PS加上 ...

  6. PS快捷键大全,记住这些就够了!

    希望能帮到大家更好的学习.

  7. Aspose.Words给word文档加水印

    需求:在一些重要的Word文档需要打印时,添加水印以明出处. 方案:使用Aspose组件给word文档 代码:干货如下 /// <summary> /// Inserts a waterm ...

  8. centos 6.5 搭建zookeeper集群

    为什么使用Zookeeper? 大部分分布式应用需要一个主控.协调器或控制器来管理物理分布的子进程(如资源.任务分配等)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制协调程序的反复编写浪费 ...

  9. 这一周~&&html+css的学习感悟

    一周一周过的很快,这个礼拜的学习状态并不是很好,好像每个月都有那么几天学习状态不怎么样.不知道是懈怠了还是怎么了…… 没有辜负上周一开始的目标,4.6号之前我就糊好了篇论文交了上去,不知道结果如何,希 ...

  10. 在 Anaconda下解决国内安装tensorflow等下载慢和中断,出错,异常问题的一点思路

    把镜像地址改为清华大学开源软件镜像站,打开 管理员身份打开cmd 输入conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/ ...