JDK代理实例

用餐馆代理人准备饭菜为例写一个JDK代理的小实例

首先写一个人的接口,并且会吃的方法

package com.etoak.crazy.study.jdk;

public interface JdkPerson {
	void eat();
}

写一个小明实现人的接口,覆写吃的方法

package com.etoak.crazy.study.jdk;

public class JdkXiaoMing implements JdkPerson{
	
	private String name = "小明";

	@Override
	public void eat() {
		System.out.println(name+"正在吃!吃!吃!");
	}

}

然后写一个餐馆代理所有人的用餐准备

package com.etoak.crazy.study.jdk;

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

//InvocationHandler接口可以通过该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑和业务逻辑编制在一起
public class JdkRestaurant implements InvocationHandler {
	
	private JdkPerson person;
	
	public Object getData(JdkPerson person) throws Exception {
		this.person = person;
		Class clazz = person.getClass();
		/*通过Proxy的newProxyInstance静态方法实现接口的代理实例
		 * 第一个入参为类加载器
		 * 第二个入参为创建代理实例所需实现的一组接口
		 * 第三个入参是整合了业务逻辑和横切逻辑的编辑器对象*/
		return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
	}

	@Override
	//method是被代理目标实例的某个具体方法,通过它可以发起目标实例方法的反射调用
	//args是被代理实例某个方法的入参
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		System.out.println("准备食材。。。");
		System.out.println("开始做饭。。。");
		System.out.println("陆续上菜。。。");
		
		//通过反射方法调用业务类的目标方法
		method.invoke(this.person, args);
		
		System.out.println("收拾盘子。。。");
		
		return null;
	}

}


最后写一个测试类测试

package com.etoak.crazy.study.jdk;

public class JdkTest {
	public static void main(String[] args) {
		
		try {
			JdkPerson person = (JdkPerson)new JdkRestaurant().getData(new JdkXiaoMing());
			person.eat();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

结果
JDK代理实例_第1张图片

你可能感兴趣的:(Java基础)