java动态代理和cglib
来源:互联网 发布:简谱转换五线谱软件 编辑:程序博客网 时间:2024/05/16 08:23
java动态代理:
接口
package com.sjc.service;public interface UserManagerService{public void addUser();}
业务实现类
package com.sjc.service.impl;import com.sjc.service.UserManagerService;public class UserManagerServiceImpl{@Overridepublic void addUser(){System.out.println("添加一个普通用户");}}
代理类
package com.sjc.service.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class UserManagerProxy implements InvocationHandler{private Object obj;public UserManagerProxy(Object obj){this.obj = obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("time start : " + System.currentTimeMillis());Object obj = method.invoke(o, args);System.out.println("time end : " + System.currentTimeMillis());return obj;}}
测试类
package com.sjc.service.test;import java.lang.reflect.Proxy;import com.sjc.service.impl.UserManagerServiceImpl;import com.sjc.service.UserManagerService;public class InvokeTest {public static void main(String []args){UserManagerProxy userManagerProxy = new UserManagerProxy(new UserManagerServiceImpl());UserManagerService userManagerService = (UserManagerService)Proxy.newProxyInstance(UserManagerServiceImpl.class.getClassLoader(), UserManagerServiceImpl.class.getInterfaces(), userManagerProxy);userManagerService.addUser();System.out.println(userManagerService.getClass().getName());}}
cglib的动态代理
接口类的编写
package my.cglib;public interface UserManagerService {public void addUser();public void deleteUser();}
实现类的编写
package my.cglib;public class UserManagerServiceImpl implements UserManagerService{@Overridepublic void addUser() {System.out.println("Add One User");}@Overridepublic void deleteUser() {System.out.println("Delete One User");}}
MethodInterceptor接口的实现
package my.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class UserManagerProxy implements MethodInterceptor{@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("begin time" + System.currentTimeMillis());Object o = proxy.invokeSuper(obj, args);System.out.println("end time" + System.currentTimeMillis());return o;}}
工厂类
package my.cglib;import net.sf.cglib.proxy.Enhancer;public class UserManagerFactory {public static UserManagerService getInstance(UserManagerProxy poxy){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserManagerServiceImpl.class);enhancer.setCallback(poxy);return (UserManagerService)enhancer.create();}}
测试类
package my.cglib;public class Client {public static void main(String args[]){UserManagerService userService = UserManagerFactory.getInstance(new UserManagerProxy());userService.addUser();userService.deleteUser();}}
如果不需要对deleteUser()方法进行代理的话,需要进行如下操作
实现CallbackFilter接口
package my.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.CallbackFilter;public class UserManagerFilter implements CallbackFilter{@Overridepublic int accept(Method method) {if("deleteUser".equals(method.getName())){return 1;}else{return 0;}}}
修改工厂类:
package my.cglib;import net.sf.cglib.proxy.Callback;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.NoOp;public class UserManagerFactory {public static UserManagerService getInstance(UserManagerProxy poxy){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserManagerServiceImpl.class);enhancer.setCallbacks(new Callback[] { poxy, NoOp.INSTANCE });enhancer.setCallbackFilter(new UserManagerFilter());return (UserManagerService)enhancer.create();}}
0 0
- java动态代理和cglib
- Java 动态代理和CGlib
- java动态代理和cglib动态代理
- java动态代理和cglib动态代理
- Java动态代理和cglib动态代理
- java 动态代理 和 cglib代理
- Java动态代理和CGLIB代理
- Java静态代理和jdk动态代理、Cglib动态代理
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- Oracle常用性能监控语句解析
- Java连接access数据库
- 基于树莓派raspberry: 移植 2.4寸TFT显示屏以及源码分析
- java动态编译动态加载方法
- [暴力搜索]Island of Logic UVA592
- java动态代理和cglib
- 动态规则问题详解(四)
- SP2-0042: unknown command--rest of line ignored.
- C++中数字与字符串之间的转换
- ServiceBroker相关Sys系统表
- android.util.AndroidRuntimeException: You cannot combine custom titles with other title features
- PHP作为服务器程序的性能考虑
- 简单实现ajax验证用户是否可以登录
- Building Your Own Allocator