动态代理-模板
Posted houchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理-模板相关的知识,希望对你有一定的参考价值。
/*
体会:其实就是当你调用被代理中的方法时,实际上执行的是代理类的同名方法!!!!
*/
package com.atguigu.character15.daili; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author houChen * @date 2020/4/15 22:02 * @Description: 动态代理的举例 */ interface Human{ String getBelief(); void eat(String food); } // 被代理类 class SuperMan implements Human{ @Override public String getBelief() { return "Nothing can make me lose,unless i don‘t want win"; } @Override public void eat(String food) { System.out.println("超人吃的是:" + food); } } /* 要想实现动态代理,需要解决的问题? 问题1:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象? 问题2:当通过代理类的对象调用方法时,如何动态的调用被代理类的同名方法? */ class ProxyFactory{ //调用此方法,返回一个代理类的对象,解决问题一 public static Object getProxyInstance(Object obj){ //obj:被代理类的对象 MyInvocationHandler handler = new MyInvocationHandler(); handler.bind(obj); Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler); return o; } } class MyInvocationHandler implements InvocationHandler{ private Object obj; // 需要使用被代理类的对象来赋值 public void bind(Object obj){ this.obj = obj; } // 当我们通过代理类的对象调用方法a时,就会自动的调用如下的方法invoke @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 被代理类要执行的方法a,就写在invoke中 Object invoke = method.invoke(obj, args); return invoke; } } public class ProxyTest { public static void main(String[] args) { //被代理类对象 SuperMan superMan =new SuperMan(); //代理类的对象 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); //通过代理类对象调用方法时,会自动调用被代理类的同名方法 String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("满汉全席!!"); } }
以上是关于动态代理-模板的主要内容,如果未能解决你的问题,请参考以下文章