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. 静态代理: 代理对象与被代理对象必须实现同一个接 ...
随机推荐
- Jmeter常用脚本开发之SOAP/XML-RPC Request
SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议: SOAP/XML-RPC Request ...
- c# 24种设计模式
备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单 ...
- PAT 1039 到底买不买(20)(20 分)
1039 到底买不买(20)(20 分) 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要 ...
- PhpStorm 为 Laravel 搭建 PhpUnit 单元测试环境
1.PhpStorm 中打开项目的路径为 Laravel 安装的根目录 2.点击右下角 EventLog 提示按钮, 初始化 Composer 的设置 3.打开单元单测试示例类,按提示点击 Fix . ...
- Netty Reator(二)Scalable IO in Java
Netty Reator(二)Scalable IO in Java Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) Do ...
- Python之路(第十四篇)os模块
一.os模块 1.os.getcwd() 获取当前工作目录(当前工作目录默认都是当前文件所在的文件夹) import os print(os.getcwd()) 2.os.chdir(path) 改变 ...
- 接口没添加@responseBody注解
今天在重写springaop小demo时,发现调用接口时,可以在控制台上正常返回结果,但是页面报错,debug半天,可以看到是调用了modelview的时候出错,找不到视图了.. debug的时候控制 ...
- 拼图类APP原型模板分享——简拼
简拼是一款记录美好.抒写情怀的拼图APP,模板设计风格简约文艺,种类齐全. 此原型模板所用到的组件有标签组.水平分隔线.圆形工具.交互动作有结合标签组实现页面跳转,选择组件触发按钮状态变化等. 此原型 ...
- vuejs导航条动态切换active状态
用一个数组存导航条,用v-for循环它,这样可以减少代码,二可以使用它的下标来判断高亮,三还可以获取后端的导航信息来遍历 重点是在:routerLink(index, path)函数,传入当前点击的下 ...
- 安装ubuntu16.04的时候出现的detecting file system
解决问题方法是,进入主界面执行,如下操作即可: sudo umount -l /isodevice