设计模式--JDK动态代理--新手笔记

本文 是 按照慕课网 动态代理章节 总结的! 感谢慕课网


jdk的 动态代理


 

前面是动态代理的一些解释,最后有代码实例,可以复制运行的,最好自己敲一遍;再次感谢慕课网

在 代理 类和 被代理类 之间 加入了实现 InvocationHandler的类;我们也叫(InvocationHandler)事务处理器,像我们的日志处理,时间处理 都是在我们的处理器中完成的;

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

    (1)、Interface.InvocationHandler : 该接口中仅定义了一个方法;

                public object invoke(Object,Method method,Object[] args)

                在实际使用时,第一个参数obj一般是指 代理类,method 是被代理的方法,args为该方法的参数数组。

                这个抽象方法在代理类中动态实现。

    (2)Proxy:该类即为动态代理类

            static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,

            返回后的代理类可以当作被代理类使用(可使用代理类的在接口中声明过的方法)。


代理模式—动态代理


所谓Dynamic Proxy 是这样一种class:

他是在运行时生成的class

该class 需要实现一组interface

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

解释:jdk动态代理, 其实是我们被代理对象 首相要实现了某些接口;然后在运行的时候,我们产生了一个class对象,这也就是我们的代理类;

产生了动态代理,并不能做具体的事,我们只能给他声明一个handler,由他来接管我们实际的工作,也就是我们想实现日志的 一个代理功能,我们具体的业务呢,是在我们handler当中来实现的。


动态代理实现步骤

1、创建一个实现接口InvocationHandler 的类,它必须实现invoke方法

2、创建被代理的类以及接口

3、调用Proxy的静态方法,创建一个代理类

        newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h )

4、通过代理调用方法


代码实例:

//接口

package test.proxy;

public interface MoveAble {
	public void dive();

}

//实体类

package test.proxy;

import java.util.Random;

public class Car implements MoveAble {

	@Override
	public void dive() {
		try {
			Thread.sleep(new Random().nextInt(1000));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("car dive");

	}

}

//实现handler的类 事务管理器

package test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class CarHandler implements InvocationHandler {
	
	public CarHandler(Object object){
		this.obj = object;
	}
	
	private Object obj;
	/**
	 * 参数: 
	 * proxy 被代理对象
	 * method 被代理对象的方法
	 * args 方法的参数
	 * 
	 * 返回值:
	 * Object 调用这个方法的返回值
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//调用 我们代理对象的方法,method.invoke();被代理的对象,填入我们传递过来的对象;args是参数,没有阐述,可以去掉;
		//在调用 的前后 来处理业务逻辑
		long sartTime = System.currentTimeMillis();
		System.out.println("汽车开始行驶.....");
		method.invoke(obj, args);
		long endTime = System.currentTimeMillis();
		System.out.println("汽车结束行驶..... 汽车行驶时间"+ (endTime-sartTime)+"毫秒");
		return null;
	}

}

//测试类

package test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class TestProxy {
	/**
	 * 
	 * Jdk动态代理
	 */
	public static void main(String[] args) {
		Car car = new Car();
		InvocationHandler h = new CarHandler(car);//初始化 事务处理器
		Class<?> cls = car.getClass();
		/**
		 * 参数:
		 * loader 类加载器
		 * interfaces 实现接口
		 * h InvocationHandler 事务处理器
		 */
		//这样就是返回了一个动态代理对象,应为都是事项了moveable接口,所有可以用接口的类型来接受这个返回值
		MoveAble m = (MoveAble) Proxy.newProxyInstance(cls.getClassLoader(),
								cls.getInterfaces(), h);
		m.dive();//调用返回动态代理的 行驶方法
	}

}

//运行结果

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值