zoukankan      html  css  js  c++  java
  • 关于动态代理的一点心得

    刚学习的时候总是搞不明白动态代理中哪个是代理对象,哪个是原来的对象,最近搞明白了,特地来记录下,很浅显,希望能够帮助大家

    一. 先写一个接口,就叫Function,包括睡觉和吃饭方法 

    package dynamicProxy;
    
    public interface Function {
    	
    	public void sleep();
    	
    	public String eat(String name);
    
    }   
    

    二.再写一个实现类,就叫dog

    package dynamicProxy;
    
    public class Dog implements Function {
    
    	@Override
    	public void sleep() {
    		System.out.println("小狗睡觉");
    
    	}
    
    	@Override
    	public String eat(String name) {
    
    		return "小狗吃"+name;
    	}
    
    }
    

    三,我们再写一个类实现invocationHandler,里面的bind方法是获取代理对象的

    package dynamicProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class MyInvocationHandler implements InvocationHandler{
    	
    	private Object obj;
    	
    	public Object bind(Object obj){
    		this.obj=obj;
    		Object proxy= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    		System.out.println("绑定方法中的obj:"+obj.getClass().getName());
    		System.out.println("绑定方法中的proxy:"+proxy.getClass().getName());
    		 return proxy;
    	}
    
    	@Override
    	public Object invoke(Object obj, Method method, Object[] args)
    			throws Throwable {
    		System.out.println("代理方法中的obj:"+obj.getClass().getName());
    		System.out.println("代理类中的obj:"+this.obj.getClass().getName());
    		Object invoke = method.invoke(this.obj, args);
    		return invoke;
    	}
    
    }
    

    4.最后测试

    package dynamicProxy;
    
    public class TestProxy {
    	public static void main(String[] args) {
    		MyInvocationHandler mh=new MyInvocationHandler();
    		Function dog = (Function) mh.bind(new Dog());
    		dog.sleep();
    	}
    
    }
    

    5.结果 控制台:

    绑定方法中的obj:dynamicProxy.Dog
    绑定方法中的proxy:$Proxy0
    代理方法中的obj:$Proxy0
    代理类中的obj:dynamicProxy.Dog
    小狗睡觉

    这就充分说明了,invoke方法理的obj是代理对象,并不是原来的对象,一开始我把method中invoke方法写成了obj,导致报错,因为这个是代理对象,而这里必须要用原对象,

    我是这么理解的,如有不当还请指正:当我们用bind方法的时候获取的就是代理对象(绑定方法中打印的是:$Proxy0),当我们用代理对象调用方法的时候会自动调到invoke方法,如果这个时候invoke方法再用代理对象不就重复了吗,再有,代理对象也需要通过原对象去访问原对象的方法,所以这里应该是原对象.

  • 相关阅读:
    串口应用
    状态栏颜色
    冒泡排序
    快速排序
    good软件测试博客地址
    软件测试面试题
    股票基础知识
    软件测试基本知识
    软件测试流程
    mycat实现分库分表(二)
  • 原文地址:https://www.cnblogs.com/shaoyang/p/6855671.html
Copyright © 2011-2022 走看看