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

    在java的java.lang.reflect包下面提供了一个Proxy类和一个invocationHander接口,通过这个类和接口就可以生成JDK动态代理类和动态代理对象。

    首先来看一下Proxy类,Proxy 提供用于创建动态代理类和代理对象的静态方法, 它也是所有动态代理类的父类。它只有一个构造方法:

     

    Proxy 提供了两个方法来创建动态代理类和动态代理实例:

     

    然后invocationHander是一个接口,每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。 


    关于这些其实了解下就好了,现在通过代码来实现java的动态代理。注意的是:java动态代理只能代理实现了同一个接口的类,cglib可以代理同一个类,具体的这个内容我回来整理spring框架的时候再做整理。

    package linkin;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Linkin
    {
    	public static void main(String[] args)
    	{
    		Class proxyClass = Proxy.getProxyClass(Linkin.class.getClassLoader(), new Class[] { Linkin1.class });
    		//如果这里直接一步传入了InvocationHandler,那么前一个参数不能在动态传入,一定要写成数组形式
    		Linkin1 linkin = (Linkin1) Proxy.newProxyInstance(Linkin.class.getClassLoader(), new Class[] { Linkin1.class }, new InvocationHandler()
    		{
    			@Override
    			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    			{
    				// TODO Auto-generated method stub
    				return null;
    			}
    		});
    		System.out.println(proxyClass);
    		System.out.println(linkin.getClass());
    	}
    
    }
    
    //这里定义这个接口,统一为这个接口来跑代理
    interface Linkin1
    {
    
    }
    

    java的动态代理主要是用来实现AOP(面向切面编程),下面通过代码来演示如何AOP编程。

    package linkin;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class Linkin implements Person
    {
    	public static void main(String[] args)
    	{
    		//原始对象和代理对象实现了同一个接口,也就是说通过同一个接口来为原始对象创建了一个代理对象,代理对象可以执行原始对象的所有的方法,而且在原来的
    		//方法上还加入了通用的一系列操作
    		Linkin linkin = new Linkin();//原始的对象
    		Person linkinProxy = (Person) ProxyFactory.getProxy(linkin);//被代理的对象
    		linkin.sayInfo("这里是原始的对象的方法...");
    		System.out.println("===============");
    		linkinProxy.sayInfo("这里是代理对象的方法");
    	}
    
    	@Override
    	public void sayInfo(String str)
    	{
    		System.out.println("仰天大笑出门去..."+str);
    	}
    
    	@Override
    	public void test()
    	{
    		System.out.println("我辈岂是蓬蒿人...");
    	}
    
    }
    
    //这里定义这个接口,统一为这个接口来跑代理
    interface Person
    {
    	//这里定义2个方法用来测试
    	void sayInfo(String str);
    	void test();
    }
    
    //定义通用的类,里面模拟一些通用方法
    class LinkinUtil
    {
    	public void test()
    	{
    		System.out.println("这里是第一个通用方法。。。");
    	}
    	public void test1()
    	{
    		System.out.println("这里是第2个通用方法。。。");
    	}
    }
    
    //这里是InvocationHandler的实现类,这个才是重点
    class LinkinInvocationHandler implements InvocationHandler
    {
    	//这里把这个要被代理的对象放进来
    	private Object taget;
    	
    	public LinkinInvocationHandler()
    	{
    		
    	}
    	//在给一个带这个参数的构造器好了
    	public LinkinInvocationHandler(Object taget)
    	{
    		this.taget = taget;
    	}
    
    	public Object getTaget()
    	{
    		return taget;
    	}
    
    	public void setTaget(Object taget)
    	{
    		this.taget = taget;
    	}
    
    	@Override
    	//执行动态代理对象的所有的方法时,都变成了这个invoke方法。
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
    	{
    		LinkinUtil linkinUtil = new LinkinUtil();
    		linkinUtil.test();
    		Object result = method.invoke(taget, args);
    		linkinUtil.test1();
    		return result;
    	}
    	
    }
    
    //定义个工厂,用来获得每一个代理对象
    class ProxyFactory
    {
    	public static Object getProxy(Object target)
    	{
    		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), 
    				new LinkinInvocationHandler(target));
    	}
    }
    



  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233120.html
Copyright © 2011-2022 走看看