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