JDK动态代理代码示例
JDK动态代理代码示例
- 业务接口
- 实现了业务接口的业务类
- 实现了InvocationHandler接口的handler代理类
1、业务接口
package com.wzq.demo01;
/**
* 业务接口
*
* @author Muscleape
*
*/
public interface UserService {
/**
* 增加一个用户
*/
public void addUser();
/**
* 编辑账户
*/
public void editUser();
}
2、业务接口实现类
package com.wzq.demo01;
/**
* 业务接口实现类
*
* @author Muscleape
*
*/
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("增加一个用户。。。");
}
@Override
public void editUser() {
System.out.println("编辑一个用户。。。");
}
}
3、实现了InvocationHandler接口的handler代理类
package com.wzq.demo01;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ServiceInvocationHandler implements InvocationHandler {
/**
* 目标对象
*/
private Object target;
/**
* 构造函数
*
* @param target
*/
public ServiceInvocationHandler(Object target) {
super();
this.target = target;
}
/**
* 实现InvocationHandler接口的方法
*
* 执行目标对象的方法,并进行增强
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("代理类方法,进行增强。。。");
System.out.println("事务开始。。。");
// 执行目标方法对象
result = method.invoke(target, args);
System.out.println("事务结束。。。");
return result;
}
/**
* 创建代理实例
*
* @return
* @throws Throwable
*/
public Object getProxy() throws Throwable {
return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
this.target.getClass().getInterfaces(), this);
// 这样写只返回了目标对象,没有生成代理对象
// return null;
}
}
4、测试类
package com.wzq.demo01;
public class Test {
/**
* jdk动态代理会生成一个动态代理类,生成相应的字节码,然后通过ClassLoader加载字节码;
*
* 该实例继承了Proxy类,并实现了业务接口,在实现的方法里通过反射调用了InvocationHandler接口实现类的invoke()回调方法;
*
* @param args
* @throws Throwable
*/
public static void main(String[] args) throws Throwable {
UserService userService = new UserServiceImpl();
ServiceInvocationHandler handler = new ServiceInvocationHandler(userService);
// 根据目标生成代理对象
UserService proxy = (UserService) handler.getProxy();
proxy.addUser();
}
}
5、测试结果
代理类方法,进行增强。。。
事务开始。。。
增加一个用户。。。
事务结束。。。
JDK动态代理代码示例的更多相关文章
- cglib动态代理代码示例
cglib动态代理代码示例 引用包cglib-xxx.jar 非Maven项目还需要手动引用包asm-xxx.jar 业务类(不需要定义接口) cglib代理类(实现接口MethodIntercept ...
- 自己动手实现JDK动态代理
出自:作者:孤独烟 http://rjzheng.cnblogs.com/ ------------------------------------------------------------- ...
- JAVA设计模式-动态代理(Proxy)示例及说明
在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概念,下面我们就简单了解一下动态代理. 一,概念 代理设计模式的目的就是在不直接操作对象的前 ...
- 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式
从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...
- AOP-底层原理(JDK动态代理实现)
AOP(JDK动态代理) 1,使用JDK动态代理,使用Proxy类里面的方法创建代理对象 (1)调用 newProxyInstance 方法 方法有三个参数 第一参数,类加载器 第二参数,增强方法所在 ...
- Java JDK 动态代理实现和代码分析
JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...
- 静态代理和利用反射形成的动态代理(JDK动态代理)
代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 静态代理 1.新建 ...
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
spring-aop-4.3.7.RELEASE 在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...
- jdk动态代理举例
JDK动态代理是基于接口的代理,下面举例说明 代理类:proxy,代理动作必须要基于一个proxy实例来执行 代理执行类:实现InvocationHandler,案例中是TestInvocationH ...
随机推荐
- IOS UI-QQ好友列表
一.Model // // FriendsModel.h // IOS_0111_好友列表 // // Created by ma c on 16/1/11. // Copyright (c) 201 ...
- nginx会话保持之sticky模块
nginx会话保持之nginx-sticky-module模块 在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:1.ip hash,根据客户端的IP,将请求分配到不同的服务器上:2.cooki ...
- qt Cannot connect creator comm socket /tmp/qt_temp.S26613/stub-socket: No such
Tool->Options->Environment->General 将terminal改为 xterm -e
- Halcon12新特性之VS可视化调试插件
当我们用VC\C#调试halcon代码的时候,通常会遇到一个头痛的问题,我们无法看到halcon变量的调试信息 如下图:什么鬼...什么鬼 比如我们想看一个double数值变量,我们需要 doub ...
- 如何创建管理员权限的CMD命令提示符窗口
最近在使用netstat -anob命令时提示 请求的操作需要提升. 总结了几种创建管理员权限的CMD命令行的方法. 创建临时管理员权限的CMD Win8系统: 按下windows徽标,直接输入cmd ...
- SSRS 在使用矩阵的时候,隐藏掉一列空白值
SSRS 在使用矩阵的时候会因为数据集中含有NULL导致出现一列空白值 数据结果如图: 然后以houseid 作为矩阵组列,productcode作为行, 列名196前面多出就是NUll的列,那么我们 ...
- STL标准库-容器-deque
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...
- ReactNative 问题集合
在线流畅播放视频 (建议调用原生的视频组件, 或者在成熟的安卓 ios组件封装一层) 如何指定页面横屏 (在这个组件react-native-orientation基础上改写) webSocket不和 ...
- laravel 创建自定义全局函数
全局函数的实现是依靠在初始化的时候,将helps.php或者functions.php直接进行了加载.而Laravel中bootstrap/autoload.php(laravel 5.5 貌似没有这 ...
- Android分类导航
新的一年,将在2017下半年所写的博文作了个总结,也是方便自己以后查阅,整理完也是发现在这半年而是学到了许多,新的一年,继续努力! 我的第一个Android开源库——CirclePointMove中文 ...