没有梦想,何必远方

jdk的动态代理

package com.jy.util;


import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) throws Exception {
        
        
        /*
        jdk的动态代理为什么只能是接口分析如下:
        将动态代理生成的字节码写入文件,其代理类是继承了原有的Proxy类,并实现implements了需要被代理的接口
        因为在java中是单继承,所以jdk的动态代理只能是接口
        */
        
        //UserService CompanyService 为需要生成代理的接口
        Class<?>[] clazz = {UserService.class, CompanyService.class};
        byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy", clazz);
        FileOutputStream fos = new FileOutputStream("$Proxy.class");
        fos.write(bytes);
        fos.flush();
        fos.close();
        
        new Test().proxyTest();

    }

    private void proxyTest() {
        Class<?>[] interfaces = {IProxyTest.class};
        IProxyTest iProxyTest = (IProxyTest)Proxy.newProxyInstance(this.getClass().getClassLoader(), interfaces,new MyInvocationHandler(new IProxyTestImpl()));
        iProxyTest.run();
    }
    /**
        jdk的动态代理
    */
    class MyInvocationHandler implements InvocationHandler{
        private Object target;
        MyInvocationHandler(Object target){
            this.target = target;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //动态代理前置处理
            System.out.println("前置处理");
            Object obj = method.invoke(target, args);
            //动态代理后置处理
            return obj;
        }
    }
}

 

posted @ 2019-03-08 18:49  北极丶光  阅读(98)  评论(0编辑  收藏  举报