标签:style blog http color io os 使用 java ar
1.权限拦截判断;
2.对象功能(方法)增强。
1.代理对象存在的价值:主要用于拦截对真实业务对象的访问。
2.代理一个接口下的所有方法;
用该方法生成代理对象时,需要三个参数:
1.生成代理对象使用哪个类装载器
2.生成哪个对象的代理对象,通过接口指定:该对象所属类一定要实现一个接口;
代理谁:某个具体对象或object,代理后你可以找其他对象做这个事!!!
3.生成的代理对象的方法里干什么事,由开发人员编写handler接口的实现来指定。
代理类:
1 package com.mzj.practice.test; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import org.slf4j.Logger; 8 import org.slf4j.LoggerFactory; 9 10 public class XProxy { 11 private final Logger LOG = LoggerFactory.getLogger(this.getClass()); 12 13 private Object target; // 目标对象 14 15 /** 16 * 构造方法 17 * @param target 目标对象 18 */ 19 public XProxy(Object target) { 20 super(); 21 this.target = target; 22 } 23 24 // private MX chun = new MX(); 25 // 26 // public Object getProxy() { 27 // return Proxy.newProxyInstance(XProxy.class.getClassLoader(), chun.getClass() 28 // .getInterfaces(), new InvocationHandler() { 29 // @Override 30 // public Object invoke(Object proxy, Method method, Object[] args) 31 // throws Throwable { 32 // if (method.getName().equals("dance")) { 33 // System.out.println("交钱..."); 34 // return method.invoke(chun, args); 35 // } 36 // if (method.getName().equals("sing")) { 37 // System.out.println("交很多钱..."); 38 // return method.invoke(chun, "十八摸"); 39 // } 40 // return null; 41 // } 42 // }); 43 // } 44 45 public Object getProxy() { 46 return Proxy.newProxyInstance(XProxy.class.getClassLoader(), target.getClass() 47 .getInterfaces(), new InvocationHandler() { 48 @Override 49 public Object invoke(Object proxy, Method method, Object[] args) 50 throws Throwable { 51 if (method.getName().equals("dance")) { 52 LOG.info(method.getName()+"调用前。。。"); 53 System.out.println("交钱..."); 54 LOG.info(method.getName()+"调用后。。。"); 55 return method.invoke(target, args); 56 } 57 if (method.getName().equals("sing")) { 58 LOG.info(method.getName()+"调用前。。。"); 59 System.out.println("交很多钱..."); 60 LOG.info(method.getName()+"调用后。。。"); 61 return method.invoke(target, "十八摸"); 62 } 63 return null; 64 } 65 }); 66 } 67 68 public static void main(String[] args) { 69 MX chun = new MX();//被代理的对象 70 XProxy proxy = new XProxy(chun); 71 Person mingxing = (Person) proxy.getProxy();// 一定是指向接口; 72 mingxing.dance("跳"); 73 mingxing.sing("跳"); 74 75 } 76 }
接口:
1 package com.mzj.practice.test; 2 /** 3 * Copyright (C),HTF<br> 4 * 通过代理者 能调用对象的哪些方法 都通过接口对外开放 5 * 6 * @author muzhongjiang 7 * @date 2014年9月13日 8 */ 9 public interface Person { 10 11 void dance(String string); 12 13 void sing(String string); 14 15 }
被代理类:
1 package com.mzj.practice.test; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 public class MX implements Person { 7 8 private final Logger LOG = LoggerFactory.getLogger(this.getClass()); 9 10 @Override 11 public void dance(String string) { 12 LOG.info("string=【" + string + "】"); 13 } 14 15 @Override 16 public void sing(String string) { 17 LOG.info("string=【" + string + "】"); 18 } 19 20 public void selfMeth(String string) { 21 LOG.info("string=【" + string + "】"); 22 } 23 24 }
标签:style blog http color io os 使用 java ar
原文地址:http://www.cnblogs.com/muzhongjiang/p/3969670.html