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方法再用代理对象不就重复了吗,再有,代理对象也需要通过原对象去访问原对象的方法,所以这里应该是原对象.

  • 相关阅读:
    Spring基于注解整合Redis实现内容缓存
    配置Mybatis二级缓存为Redis来实现内容缓存
    Spring整合Redis
    Java连接redis
    机器学习之 KNN近邻算法(一)入门
    matplotlib 之 快速入门
    Pandas 之入门
    Hadoop 之 环形缓冲区原理
    numpy 之 rollaxis的理解
    python 之 遇到SyntaxError: Non-UTF-8 code starting with 'xb8' in file
  • 原文地址:https://www.cnblogs.com/shaoyang/p/6855671.html
Copyright © 2011-2022 走看看