静态的代理
ProxyInterface接口
/**
* 自定义一个ProxyInterface接口,里面定义一个ProxyInterfaceMethod方法
*/
interface ProxyInterface {
void ProxyInterfaceMethod();
}
被代理类
/**
* Star明星类实现代理接口,重写了ProxyInterface接口方法
*/
class Star implements ProxyInterface {
public Star() {
}
/**
* 重写了代理接口方法
*/
@Override
public void ProxyInterfaceMethod() {
System.out.println("明星接到通知开始做某些事");
}
}
代理类
/**
* StarAgent类实现ProxyInterface接口
* 1.重写了ProxyInterface接口方法,且ProxyInterfaceMethod方法调用了Star类的重写的方法,完成代理功能
* 2.定义了一个实例化Star类的构造器
*/
class StarAgent implements ProxyInterface {
private ProxyInterface star;
/**
* 一个实例化Star明星类的构造器
*/
public StarAgent(ProxyInterface star) {
this.star = new Star();
}
public StarAgent() {
super();
}
/**
* 重写了ProxyInterface接口方法, 且方法内调用了Star类的重写的方法,完成代理功能
*/
@Override
public void ProxyInterfaceMethod() {
System.out.println("经纪人准备叫明星做某些事");
// 叫明星做一些事
star.ProxyInterfaceMethod();
System.out.println("经纪人看着明星做完某些事");
}
}
测试类
package Test10月;
/**
* @author 罗德
* @version 1.0
*/
public class Test1004 {
/**
* 功能描述:
* 1.实例化Star类和StarAgent类,且star对象传入StarAgent构造器中
* 2.实例化的starAgent调用ProxyInterfaceMethod方法完成代理功能
*/
public static void main(String[] args) {
Star star = new Star();
StarAgent starAgent = new StarAgent(star);
starAgent.ProxyInterfaceMethod();
/*
*经纪人准备叫明星做某些事
*明星接到通知开始做某些事
*经纪人看着明星做完某些事
*/
}
}
动态代理模式
动态创建代理类
class DynamicProxy {
public static Object getProxy(Object obj) {
MyInvocationHandler invocationHandler = new MyInvocationHandler();
//将被代理类的对象传入MyInvocationHandler,在这里面调用对应方法
invocationHandler.proxyMethod(obj);
/**
* 功能描述:public static Object newProxyInstance(ClassLoader loader,
* @NotNull Class<?>[] interfaces,
* @NotNull reflect.InvocationHandler h)
* 返回将方法调用分派到指定调用处理程序的指定接口的代理实例。
*
* 方法参数描述:
* loader–定义代理类的类加载器
* interfaces–要实现的代理类的接口列表
* h–将方法调用分派到的调用处理程序
*/
Object newProxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), invocationHandler);
return newProxyInstance;
}
}
实现InvocationHandler 接口的实现类
/**
* 功能描述:使代理类对象调用方法会转到本类的invoke()方法;
* public interface InvocationHandler
* InvocationHandler是由代理实例的调用处理程序实现的接口。
* 每个代理实例都有一个关联的调用处理程序。当在代理实例上调用一个方法时,
* 方法调用被编码并调度到其调用处理程序的invoke方法。
* 方法参数描述:无
*/
class MyInvocationHandler implements InvocationHandler {
private Object object;
/**
* 功能描述:
* 将被代理类对象传入MyInvocationHandler类中,
* MyInvocationHandler类相当于代理类,使用被代理类对象去调用与代理类相同的方法
* 方法参数描述:无
*/
public void proxyMethod(Object object) {
this.object = object;
}
public MyInvocationHandler() {
}
/**
* 功能描述:
* 1.代理调用方法会转到这个方法,方法名为method,方法参数为args,proxy为代理对象的名字,因为可能会有不同的代理
* 2.用反射掉用本类object实例对象,参数为args的方法
* 处理代理实例上的方法调用并返回结果。
* 当在与之关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
* 方法参数描述:
* proxy–调用方法的代理实例
* method–与在代理实例上调用的接口方法相对应的方法实例。
* args–一个对象数组,其中包含在代理实例的方法调用中传递的参数值,如果接口方法没有参数,则为null。
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* 功能描述:反射:调用方法(代理类对象传过来的方法)
* public Object invoke(Object obj,Object... args)
* 在具有指定参数的指定对象上调用此方法对象表示的基础方法。
* 单个参数会自动展开以匹配原始形式参数,并且基本参数和引用参数都会根据需要进行方法调用转换。
* 方法参数描述:
* obj–从中调用基础方法的对象
* args–用于方法调用的参数
*/
Object invoke = method.invoke(object, args);
return invoke;
}
}
被代理类和接口
/**
* 自定义一个ProxyInterface接口,里面定义一个ProxyInterfaceMethod方法
*/
interface ProxyInterface {
void ProxyInterfaceMethod();
}
/**
* Star明星类实现代理接口,重写了ProxyInterface接口方法
*/
class Star implements ProxyInterface {
public Star() {
}
/**
* 重写了代理接口方法
*/
@Override
public void ProxyInterfaceMethod() {
System.out.println("明星接到通知开始做某些事");
}
}
测试类
/**
* @author 罗德
* @version 1.0
*/
public class Test1004 {
/**
* 功能描述:
* 1.创建动态代理实例,调用代理的方法
* 2.被代理会调用与代理实例同名的方法,完成动态代理
* 方法参数描述:无
*/
@Test
public void test() {
Star star1 = new Star();
//创建动态代理实例,运用多态,Object中没有ProxyInterfaceMethod方法
Object proxy1 = DynamicProxy.getProxy(star1);
//强制转换为ProxyInterface,使用特有的ProxyInterfaceMethod()方法
ProxyInterface proxy = (ProxyInterface) proxy1;
//调用代理的方法
proxy.ProxyInterfaceMethod();//明星接到通知开始做某些事
}
}