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();//明星接到通知开始做某些事 } }