码迷,mamicode.com
首页 > 其他好文 > 详细

动态代理-模板

时间:2020-04-15 23:06:11      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:同名   foo   style   通过   turn   this   esc   proxy   方法   

/*
体会:其实就是当你调用被代理中的方法时,实际上执行的是代理类的同名方法!!!!
*/

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("满汉全席!!"); } }

 

动态代理-模板

标签:同名   foo   style   通过   turn   this   esc   proxy   方法   

原文地址:https://www.cnblogs.com/houchen/p/12709256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!