首页 > 代码库 > jdk动态代理
jdk动态代理
动态代理应用
1.权限拦截判断;
2.对象功能(方法)增强。
代理的意义:
1.代理对象存在的价值:主要用于拦截对真实业务对象的访问。
2.代理一个接口下的所有方法;
格式: Proxy.newProxyInstance(类加载器,被代理对象所实现的接口,代理什么);
用该方法生成代理对象时,需要三个参数:
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 // @Override30 // 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 @Override49 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 @Override11 public void dance(String string) {12 LOG.info("string=【" + string + "】");13 }14 15 @Override16 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 }
jdk动态代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。