zoukankan      html  css  js  c++  java
  • Java的动态代理的实现

    动态代理是设计模式中代理(委托)模式的变形。代理模式的实现需要一个与被代理类拥有相同接口的代理类,然后所有对被代理类调用的方法都改为向代理类调用。代理类可以修改被代理类返回的结果也可以不做处理,或者使用自己的处理。这在当修改现有的模块功能而不能修改现有类实现的情况下(即该类已经被其他模块调用,一旦修改会带来大量的副作用)很有用处。
    动态代理是在运行时可对某实现某接口的类进行代理模式的操作。以下是动态代理的简单代码,也是动态代理的框架式代码。

    
    // 业务接口
    interface Itaobao{
    	int userpay(int money, int cast);
    	String userbuy(String name);
    }
    // 现有的业务处理类
    class taobao implements Itaobao{
    	@Override
    	public int userpay(int money, int cast) {
    		return money - cast;
    	}
    	String name;
    	public void setName(String na){name = na;}
    	
    	public int method(int a, int b){return a*2+b;}
    	
    	@Override
    	public String userbuy(String name) {
    		return this.name + " buying " + name + " ";
    	}
    }
    
    public class DynamicProxy {
    
    	private static Itaobao getproxytaobao(){
    		Object proxytaobao = Proxy.newProxyInstance(taobao.class.getClassLoader(), new Class[]{Itaobao.class}, 
    				new InvocationHandler() {
    					@Override
    					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    						//System.out.println("invoke:" + proxy.toString());    //栈溢出错误
    						System.out.println("method:" + method.toString());
    						//System.out.println("args:" + proxy.toString());        //栈溢出错误
    						
    						Object returnValue = method.invoke(new taobao(), args);    //调用被代理的业务类返回结果
                                                    //  SOME PROCESS is HERE
    						return returnValue;            
    					}
    				});
    		return (Itaobao)proxytaobao;    //返回使用 Proxy.newProxyInstance 构建的类对象
    	}
    	public static void main(String[] args) throws  Exception {
                            
                            //使用class类对象使用反射创建类对象的例子。
    			taobao.class.newInstance().userpay(5, 4);
    			//System.out.println(Arrays.asList(taobao.class.getDeclaredMethod( "method")));//不能是接口方法
    			Method m = taobao.class.getDeclaredMethod("method",int.class,int.class);    //使用方法名的参数类型约束JVM解释器找到正确的方法。
    			System.out.println(m.invoke(new taobao(), 998,889));                        //invoke方法
    			
                            Itaobao protaobao = getproxytaobao();
    			//((taobao)protaobao).setName("马上风");        //无法正确向下转型,动态代理类不能转型为被代理类型。因为他只有接口方法。
    			
    			System.out.println(protaobao.userbuy("女装"));
    	}
    }
    
    
  • 相关阅读:
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    原生JS封装常用函数
    C# 将excel文件导入到SqlServer数据库
    热配置的部署以及容易失败原因
    连接真机开发安卓(Android)移动app MUI框架 添加购物车等——混合式开发(四)
    标志寄存器06 零基础入门学习汇编语言59
    指针07 零基础入门学习C语言47
    标志寄存器05 零基础入门学习汇编语言58
    标志寄存器03 零基础入门学习汇编语言56
    标志寄存器04 零基础入门学习汇编语言57
  • 原文地址:https://www.cnblogs.com/yumingle/p/6715147.html
Copyright © 2011-2022 走看看