基于JDK的动态代理

1,首先自定义一个类,并实现InvocationHandler接口,自定义一个方法如:bind(),来绑定代理类和被代理类之间的的关系。最后实现invoke方法。代码如下:

public class Business implements InvocationHandler {
	//商务部将代理软件工程师,成为软件工程师的代理者
	//1,实现InvocationHandler类
	//2,实现对软件工程师的绑定,自定义方法实现商务部(代理类)和软件工程师(被代理类)之间的代理关系
	private Object object;
	public Object bind(Object object) {
		//这一步将传入的对象参数赋值给当前私有的对象属性是为了给invoke反射执行被代理对象的方法时准备参数,即传入的类实例,至于invoke的另一个参数args,要根据
		//传入对象的方法来判断再进行传入
		this.object = object;
		//这一步很重要:执行完这一步之后,返回的对象就可以看作是商务部了,即代理对象,将类型强转为传入参数类型后就可以调用相应的方法执行核心方法了
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
		//这样就建立了代理类和被代理类之间的管理了,也就是说明代理类能代理被代理类的业务了
	}
	//3,实现invoke代理方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		try {
			System.out.println("商务部和第三方进行商务谈判");
			String a[] = {"吃饭时间","愉快时间","休息时间"};
			System.out.println(a[2]);
			method.invoke(object, args);//(谈判成功,让程序员干活)这里利用了java的反射知识去执行了object对象里参数为args的方法,也是执行的核心方法
			System.out.println("项目完成,催要工程款");
		}catch(Exception e) {
			System.out.println("谈判失败,终止谈判");
		}finally {
			System.out.println("不在继续合作,握手道别,下次再合作");
		}
		return null;
	}
}

基于JDK的动态代理_第1张图片
2,定义一个接口作为以后下挂代理类的接口,如图:
基于JDK的动态代理_第2张图片
3,定义实现类并实现上一步定义的接口,如图:
基于JDK的动态代理_第3张图片
4,测试动态代理,代码如下:

public class TestProxy {
	//(JDK实现动态代理的演示)
	public static void main(String[] args) {
		//使用动态代理时首先要创建一个代理对象
		Business b = new Business();
		//其次利用被代理的类的接口声明一个实例,再利用代理对象的bind()方法绑定代理类和被代理类的关系的同时返回一个“被代理类的对象”同时赋值给被代理类的接口所声明的实例
		//这样得到的SoftwareEngineer对象那个已经是一个代理对象
		SoftwareEngineer se = (SoftwareEngineer) b.bind(new SoftwareEngineerImpl());
		//利用返回来的被代理对象调用方法
		se.programming("张力");
		
		
		System.out.println("---------------------------------------------");
		//如下得到的SoftwareEngineer对象可以看作是一个代理对象,他就会进入代理的逻辑方法invoke里面去
		//这里可以看出当以不同的接口实现作为参数传入时就会执行当前实现类的核心方法,这就是动态代理的精彩指出
		SoftwareEngineer se2 = (SoftwareEngineer) b.bind(new SoftwareEngineerImpl2());
		se2.programming("小白");
		
	}
}

5,结果:
基于JDK的动态代理_第4张图片
6,总结:
接口可以有多个实现类,要代理哪个实现类就直接将哪个实现类的对象传入即可。

你可能感兴趣的:(基于JDK的动态代理)