JDK的动态代理

jdk动态代理

  1. 可以新建一个普通的Java项目用于练习jdk的动态代理
  2. 实现动态代理的思路:
    1. 创建一个接口,并新加一个类实现该接口
    2. 在创建一个实现接口的InvocationHanler的类,并实现invoke的方法
    3. 新建一个类测试,在这个测试方法中使用Proxy.newProxyInstance创建代理类
  3. 分解思路:接口
    public interface HireHouse {
        public void Hire();
    }

     

  4. 实现接口
    public class HireHouseImpl implements HireHouse {
        //实现接口
        @Override
        public void Hire() {
            System.out.println("HireHouseImpl实现接口:HireHouse");
        }
    }

    对应思路步骤2

  5. import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    
    /*
        实现接口:InvocationHandler
     */
    public class HireProxy implements InvocationHandler {
        //被代理的真实的角色
        private Object obj;
        
        public HireProxy(Object obj) {
            super();
            this.obj = obj;
        }
        
        /**
         * jdk的动态代理,被代理的对象必须实现接口
         * proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
         * method:我们所要调用某个对象真实的方法的Method对象(被代理对象的接口方法)
         * args:指代代理对象方法传递的参数(是被代理对象的接口方法的参数)
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("前置工作");
            System.out.println("------参数--------");
            for(Object obj1 : args){
                System.out.println(obj1);
            }
            System.out.println("------参数--------");
            Object invoke = method.invoke(obj, args);
            System.out.println("后置工作");
            return invoke;
        }
    }

     

  6. 测试代理
    import java.lang.reflect.Proxy;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
        public static void main(String[] args) {
    //        //创建被代理的接口实现类的对象
    //        HireHouseImpl h=new HireHouseImpl();
    //        //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象
    //        HireHouse hireHouse = (HireHouse)Proxy.newProxyInstance(h.getClass().getClassLoader(), h.getClass().getInterfaces(), new HireProxy(h));
    //        hireHouse.Hire();
        
            //创建被代理的接口实现类的对象
            List list = new ArrayList();
            //创建代理对象,第一个参数是获得被代理的对象 的类加载器,第二个参数获得被代理对象的类的所有接口,第三个参数是自定义代理类的对象
            List hh = (List) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new HireProxy(list));
            hh.add("张三");
        }
    
    }

     

  7. 结果如图

     

  

 

posted @ 2019-08-21 16:29  白天黑天阴天  阅读(139)  评论(0编辑  收藏  举报