day36(动态代理)
动态代理
动态代理:是实现增强类中的一种方式,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(动态代理)的更多相关文章
- JDK动态代理
一.基本概念 1.什么是代理? 在阐述JDK动态代理之前,我们很有必要先来弄明白代理的概念.代理这个词本身并不是计算机专用术语,它是生活中一个常用的概念.这里引用维基百科上的一句话对代理进行定义: A ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- java动态代理的2种实现方式
java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下 ...
- JDK动态代理实现原理
之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的.直到看了他的文章才彻底明白,附网址:htt ...
- java中动态代理的实现
动态代理的实现 使用的模式:代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.类似租房的中介. 两种动态代理: (1)jdk动态代理,jdk动态代理是由Java内部的反射机制 ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- Java动态代理
代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- 静态代理&动态代理
原文地址:http://blog.csdn.net/partner4java/article/details/7048879 静态AOP和动态AOP. 静态代理: 代理对象与被代理对象必须实现同一个接 ...
随机推荐
- HTML DOM 事件对象
HTML DOM 事件对象 由 youj 创建,小路依依 最后一次修改 2016-08-04 HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文 ...
- c# 24种设计模式4建造者模式(Builder)
先来一个例子 建造者接口 public interface IBuilder { void CreateLogo(); void CreateBody(); void CreateWheel(); v ...
- c#devexpres TreeList 最简单显示动态值的应用
为了让数据显示在行内,也为熟练一下devexpress treelist 控件, 查找了很多,最多的是先把数据放在datatable 表里边, 然后赋值给treelist的datasource 的 ...
- 3.Mysql支持的数据类型
3.Mysql支持的数据类型数据类型用来指定一定的存储格式.约束和有效范围.数据类型主要有:数值类型.字符串类型.日期和时间类型.3.1 数字类型类型名 字节数 有符号最小值 有符号最大值 无符号最小 ...
- __PRETTY_FUNCTION__, __FUNCTION__, __func__
__PRETTY_FUNCTION__, __FUNCTION__, __func__这三者的区别是什么? http://stackoverflow.com/questions/4384765/wha ...
- De novo RNA-Seq Assembly Using De Bruijn Graphs
De novo RNA-Seq Assembly Using De Bruijn Graphs 2017-06-12 09:42:47 59 0 0 在说基因组的拼接之前,可 ...
- 应用内直接跳转到Appstore
iOS开发中,应用内直接跳转到Appstore .进入appstore中指定的应用 NSString *str = [NSString stringWithFormat: @"itms:// ...
- mysql官网
https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/
- HTML的基本知识点
<!DOCTYPE HTML> <html> <body> <video width="320" height="240&quo ...
- 利用PHP脚本辅助MySQL数据库管理3-删除重复表索引
<?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...