proxy 动态代理

1.简介

:什么是代理?

答:有一个对象a,你想用另一个对象b来做他的代理,那么b叫做代理对象,a叫做被代理对象

:为什么要使用代理?

答:所以我们不再直接跟a打交道,只需跟代理对象打交道即可。代理对象可以为我们提供额外的或不同的操作。

按照代理对象的创建时期不同,可以分为两种。
静态代理,事先写好代理对象类,在程序发布前就已经存在了;动态代理,程序发布后,动态地创建代理对象。
动态代理又可分为JDK代理和CGLIB代理。

:JDK代理和CGLIB代理有何不同?

答:JDK代理,只能针对实现了接口的类生成代理。CGLIB代理,针对类实现代理,背后是继承。如果一个类是final的,那代理也无能为力。

2.jdk代理

2.1常用函数

Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
用来生成代理对象。
java.lang.reflect.InvocationHandler
接口。它有一个函数,见下:
Object java.lang.reflect.InvocationHandler.invoke(Object proxy, Method method, Object[] args) 
在对代理对象调用函数时,此函数被回调。返回值就是调用函数的返回值。

2.2用法

写一个类Handler实现InvocationHandler接口,它的一个成员变量作为被代理对象,一般通过构造函数传入。

2.3代码示例

package com.likeyihu;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//接口
interface IHelloWorld {
    void sayHelloWorld();
    void sayBye();
}
//实现类
class HelloWorldImpl implements IHelloWorld{
	@Override
   public void sayHelloWorld() {
       System.out.println("HelloWorld!");
   }
	@Override
	public void sayBye() {
		System.out.println("bye");
	}
}
//动态代理处理器
class DynamicProxyHandler implements InvocationHandler{
    //被代理对象
    private Object obj;
    public DynamicProxyHandler(Object obj) {
        this.obj = obj;
    }

    /**
     * 在代理实例上处理方法调用并返回结果
     * 
     * @param proxy 代理类
     * @param method 被代理的方法
     * @param args 该方法的参数数组
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    	System.out.println("代理类.getClass().getName()\t"+proxy.getClass().getName());
        Object result = null;
        //调用之前
         doBefore();
        //调用原始对象的方法
         if(method.getName().equals("sayBye"))
        	 System.out.println("sayBye()禁止调用,time together is just never quite enough");
         else
        	 result=method.invoke(obj, args);
        //调用之后
        doAfter();
        //void 的话返回的就是null
        return result;
    }
    
    private void doBefore(){
        System.out.println("before method invoke");
    }
    
    private void doAfter(){
        System.out.println("after method invoke\n");
    }
}
public class HelloWorldTest {

    public static void main(String[] args) {
        
        //创建动态代理对象
        IHelloWorld proxy=(IHelloWorld)Proxy.newProxyInstance(
        		HelloWorldImpl.class.getClassLoader(), 
        		HelloWorldImpl.class.getInterfaces(), 
                new DynamicProxyHandler(new HelloWorldImpl()));
        proxy.sayHelloWorld();
        proxy.sayBye();
    }
}
/*代理类.getClass().getName()	com.sun.proxy.$Proxy0
before method invoke
HelloWorld!
after method invoke

代理类.getClass().getName()	com.sun.proxy.$Proxy0
before method invoke
sayBye()禁止调用,time together is just never quite enough
after method invoke
*/

3.cglib代理


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值