zoukankan      html  css  js  c++  java
  • 动态代理代码测试(jdk和glib)

    jdk动态代理代码编写测试(只针对实现接口的方法)
    package
    com.fh.proxy; public interface UserService { public abstract void add(); }
    package com.fh.proxy;
    
    public class UserServiceImpl implements UserService {
    
        
    
        @Override
        public void add() {
           System.out.println("***************add******************");
        }
    
    }
    View Code
    package com.fh.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class MyInvocationHandler implements InvocationHandler {
        
        private Object target;
    
        public MyInvocationHandler(Object target) {
           this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("**********before*************");
            Object result = method.invoke(target, args);
            System.out.println("*********after***************");
            return result;
        }
        
        public Object getProxy() {
            return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), 
                    target.getClass().getInterfaces(), this);
        }
    
    }
    package com.fh.proxy;
    
    import org.junit.Test;
    
    public class ProxyTest {
    
         @Test
         public void tests(){
            UserService user  =  new UserServiceImpl();
            MyInvocationHandler handler = new MyInvocationHandler(user);
            UserService proxy =(UserService) handler.getProxy();
            proxy.add();
        }
    
    }
    View Code
    cglib代理-针对没有实现接口的类进行代理,构建目标类的子类进行处理
    package
    com.fh.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class EnhancerDemo { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(EnhancerDemo.class); enhancer.setCallback(new MethodInterceptorImpl()); EnhancerDemo demo = (EnhancerDemo) enhancer.create(); demo.test(); System.out.println(demo); } public void test() { System.out.println("EnhancerDemo test()"); } private static class MethodInterceptorImpl implements MethodInterceptor{ @Override public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy proxy) throws Throwable { System.out.println("before*******"+method); Object result = proxy.invokeSuper(arg0, arg2); System.out.println("after********"+method); return result; } } }

    在spring中动态代理是根据有无实现接口,但是可以强制选择cglib

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/nihaofenghao/p/9428508.html
Copyright © 2011-2022 走看看