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

    Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

    (1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, J2EEjava语言JDK1.4APIjavalangObject.html">Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。


    (2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:

    Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。

    Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

    Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。



    所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作

    在使用动态代理类时,我们必须实现InvocationHandler接口


     IHello.java

    Java代码 复制代码 收藏代码
    1. package com.dynamic.proxy;   
    2.   
    3. public interface IHello {   
    4.     public void toHello(String name);   
    5. }  
    package com.dynamic.proxy;
    
    public interface IHello {
    	public void toHello(String name);
    }

    HelloImp.java

    Java代码 复制代码 收藏代码
    1. package com.dynamic.proxy;   
    2.   
    3. public class HelloImp implements IHello {   
    4.   
    5.     public void toHello(String name) {   
    6.         System.out.println("hello:" + name);   
    7.     }   
    8.   
    9. }  
    package com.dynamic.proxy;
    
    public class HelloImp implements IHello {
    
    	public void toHello(String name) {
    		System.out.println("hello:" + name);
    	}
    
    }
    

    LogHandler.java

    Java代码 复制代码 收藏代码
    1. package com.dynamic.proxy;   
    2.   
    3. import java.lang.reflect.InvocationHandler;   
    4. import java.lang.reflect.Method;   
    5. import java.lang.reflect.Proxy;   
    6.   
    7. public class LogHandler implements InvocationHandler {   
    8.   
    9.     private Object deledate;   
    10.        
    11.     public Object bind(Object deledate){   
    12.         this.deledate = deledate;   
    13.         return Proxy.newProxyInstance(deledate.getClass().getClassLoader(), deledate.getClass().getInterfaces(), this);   
    14.     }   
    15.        
    16.     public Object invoke(Object proxy, Method method, Object[] obj)   
    17.             throws Throwable {   
    18.            
    19.         doBefore();   
    20.            
    21.         Object result = method.invoke(deledate, obj);   
    22.            
    23.         doAfter();   
    24.            
    25.         return result;   
    26.     }   
    27.        
    28.     private void doBefore() {   
    29.         System.out.println("before....");   
    30.     }   
    31.   
    32.        
    33.     private void doAfter() {   
    34.         System.out.println("after....");   
    35.     }   
    36.        
    37. }  
    package com.dynamic.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class LogHandler implements InvocationHandler {
    
    	private Object deledate;
    	
    	public Object bind(Object deledate){
    		this.deledate = deledate;
    		return Proxy.newProxyInstance(deledate.getClass().getClassLoader(), deledate.getClass().getInterfaces(), this);
    	}
    	
    	public Object invoke(Object proxy, Method method, Object[] obj)
    			throws Throwable {
    		
    		doBefore();
    		
    		Object result = method.invoke(deledate, obj);
    		
    		doAfter();
    		
    		return result;
    	}
    	
    	private void doBefore() {
    		System.out.println("before....");
    	}
    
    	
    	private void doAfter() {
    		System.out.println("after....");
    	}
    	
    }
    

    ProxyDemo.java

    Java代码 复制代码 收藏代码
    1. package com.dynamic.proxy;   
    2.   
    3. public class ProxyDemo {   
    4.   
    5.     public static void main(String[] args) throws SecurityException, NoSuchMethodException {   
    6.            
    7.         LogHandler logHandler = new LogHandler();   
    8.            
    9.         IHello hello = (IHello)logHandler.bind(new HelloImp());   
    10.            
    11.         hello.toHello("callan");   
    12.            
    13.     }   
    14. }  
  • 相关阅读:
    【2017-03-09】SQL Server 数据库基础、四种约束
    【2017-03-05】函数基础、函数四种结构、ref和out参数、递归
    procecss on技巧
    角度与弧度
    C语言求π的方法
    三轴加速度传感器角度值转换原理
    C获取数组长度
    如何使用ProcessOn制作思维导图
    processon完全装逼指南
    NORDIC GATT事件
  • 原文地址:https://www.cnblogs.com/wzh123/p/3725719.html
Copyright © 2011-2022 走看看