zoukankan      html  css  js  c++  java
  • 动态代理

    动态代理是采用JDK或第三方jar包动态生成代理类的一种代理模式,常用的第三方的有CGLib,动态代理比静态代理使用更方便,使用场景也更多,多用于AOP场景做前置或后置统一控制

     JDK自带的代理类,是基于接口来生成的,所以必须传入具体接口才能动态生成代理类,并且还需要传入处理方法InvocationHandler,这样动态生成的代理类才知道怎么处理,动态代理是基于反射实现的,其类都位于反射包下

    JDK动态代理处理类需要实现InvocationHandler接口,实现其invoke方法,并且通过构造函数注入需要代理的类,在invoke方法中调用被代理类类的方法,这样就可以在被代理类方法调用之前或之后做一些处理,因为最终JDK基于传入接口动态生成的代理类其都会统一实现调用invoke方法,而在invoke方法内部会调用其持有的真实类的方法,这样就完成了从代理类到真实类的过度,也就可以实现调用过程中的AOP编程

    public interface Star {
    	//签合同
    	void signContract();
    	//唱歌
    	void sing();
    	//收尾款
    	void collectMoney();
    }
    //=========================================
    public class RealStar implements Star {
    
    	@Override
    	public void signContract() {
    		System.out.println("RealStar 签合同");
    	}
    
    	@Override
    	public void sing() {
    		System.out.println("RealStar 唱歌");
    	}
    
    	@Override
    	public void collectMoney() {
    		System.out.println("RealStar 收尾款");
    	}
    }
    //==========================================
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class StarHandler implements InvocationHandler {
    	
    	private Star star;
    	public StarHandler(Star star) {
    		this.star = star; //通过构造函数注入真是类的引用
    	}
    
    	//只要触发代理类方法,那么就会最终触发invoke方法
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("被代理类类方法调用之前做处理");
    		method.invoke(star, args);//如果被代理类方法有返回值,这里还可以接收并返回其返回值
    		System.out.println("被代理类类方法调用之后做处理");
    		
    		return null;
    	}
    
    }
    //=========================================
    	@Test
    	public void func()
    	{
    		Star realStar=new RealStar();
    		StarHandler handler=new StarHandler(realStar);
    		//传入接口和处理类,获取代理对象
    		Star proxy = (Star)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {Star.class}, handler);
    		proxy.sing();//代理对象触发具体方法,最终会触发处理类的invoke方法
    	}
    

      

  • 相关阅读:
    CSS基础教程要点笔记
    Python编程入门-第六章 字符串 -学习笔记
    Swift游戏实战-跑酷熊猫 08 产生源源不断的移动平台
    Swift游戏实战-跑酷熊猫 07 平台的移动
    ANE-IOS与AS的互通
    Swift游戏实战-跑酷熊猫 06 创建平台类以及平台工厂类
    Swift游戏实战-跑酷熊猫 05 踩踏平台是怎么炼成的
    构建针对 iOS 和 Android 的原生扩展
    ANE打包心得
    Swift游戏实战-跑酷熊猫 04 熊猫的跳和滚的动作
  • 原文地址:https://www.cnblogs.com/javabg/p/7623380.html
Copyright © 2011-2022 走看看