1.创建接口让实现类实现实现功能的累积扩展
接口可以 写多个 , 实现功能的扩展
package cn.itsource._07_proxy_dynamic;
public interface ITicket {
/**
* 订票
*/
void order();
}
package cn.itsource._07_proxy_dynamic;
/**
* 抽象主题角色
*/
public interface IRent {
/**
* 收租
*/
void rent();
/**
* 签合同
*/
void asign();
}
2.创建编写实现类实现接口
package cn.itsource._07_proxy_dynamic;
/**
* 房东:真实主题角色
*/
public class Landlord implements IRent,ITicket{
public void rent() {
System.out.println("房东收租金");
}
public void asign() {
System.out.println("房东签合同");
}
public void order() {
System.out.println("火车票预定");
}
}
3.创建编写代理类,传入实体类调用方法
package cn.itsource._07_proxy_dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler {
//被代理对象
private Object target;
public MyInvocationHandler(Object target){
this.target = target;
}
/**
* 执行代理业务
* @param proxy 代理对象【不用】
* @param method 调用的被代理对象的方法对象
* @param args 调用的被代理对象的方法的实参列表
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法调用之前插入业务逻辑
System.out.println("方法调用之前插入业务逻辑");
//使用反射技术调用被代理对象的该方法
Object result = method.invoke(target, args);
//方法调用之后插入业务逻辑
System.out.println("方法调用之后插入业务逻辑");
return result;
}
}
4. 创建编写测试类
package cn.itsource._07_proxy_dynamic;
import org.junit.Test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
@Test
public void test() throws Exception{
/**
* ClassLoader loader 类加载器
* Class<?>[] interfaces 被代理对象实现的所有接口形成的数组
* InvocationHandler h 执行处理器
*/
// ClassLoader loader = DynamicProxyTest.class.getClassLoader();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
//创建一个被代理对象(真实主题角色)
IRent rent = new Landlord();
//获取被代理对象类实现过的所有接口,返回一个数组
Class<?>[] interfaces = rent.getClass().getInterfaces();
//执行处理器
InvocationHandler h = new MyInvocationHandler(rent);
//调用JDK自带的动态代理技术生成代理对象
IRent proxy = (IRent)Proxy.newProxyInstance(loader, interfaces, h);
System.out.println(proxy);
System.out.println(proxy.getClass());
proxy.asign();
proxy.rent();
}
}
貌似后面还有更方便地实现方法