代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
静态代理
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | package com.teenyda.静态代理;public class Demo1 { public static void main(String[] args) { IInsert stu = new StuDao(); IInsert proxy = new InsertProxy(stu); proxy.insert("insert into p values...."); proxy.update("update stu set ..."); }}interface IInsert { void insert(String sql); void update(String sql);}class InsertProxy implements IInsert { private IInsert obj; public InsertProxy(IInsert obj) { this.obj = obj; } @Override public void insert(String sql) { System.out.println("开始执行:"); obj.insert(sql); System.out.println("执行完毕!"); } @Override public void update(String sql) { System.out.println("开始执行"); obj.update(sql); System.out.println("执行完毕!"); }}class StuDao implements IInsert { @Override public void insert(String sql) { System.out.println(sql); } @Override public void update(String sql) { System.out.println(sql); }} |
动态代理
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | package com.teenyda.动态代理;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class Demo2 { public static void main(String[] args) { // TODO Auto-generated method stub ILogin user = new Usre(); InvocationHandler handler = new UserHandler(user); Class<?> clazz = user.getClass(); ILogin u = (ILogin)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), handler); u.login("张三"); u.killBoss("张三"); 大专栏 Java之代理模式 u.update("张三"); } }//接口interface ILogin{ void login(String name); void killBoss(String name); void update(String name);}//被代理类class Usre implements ILogin{ @Override public void login(String name) { // TODO Auto-generated method stub System.out.println(name+"登录啦!"); } @Override public void killBoss(String name) { // TODO Auto-generated method stub System.out.println(name+"击杀boss啦!"); } @Override public void update(String name) { // TODO Auto-generated method stub System.out.println(name+"升级啦!"); } }//代理类class UserHandler implements InvocationHandler{ private Object obj; public UserHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.print("log:"); method.invoke(obj, args); System.out.println("正在记录!"); return args; }} |
动态代理-之Cglibcloud-cglib.jar
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | package com.teenyda.MethodInterceptor代理;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;/*** @author 作者 E-mail: * @date 创建时间:2018年1月21日 上午9:55:04 * @version 1.0 * @parameter * @since * @return */public class Demo3 { public static void main(String[] args) { // TODO Auto-generated method stub ManagerProxy proxy = new ManagerProxy(); Manager m = (Manager)proxy.getProxy(Manager.class); m.root(); ManagerProxy p2 = new ManagerProxy(); Super s = (Super)p2.getProxy(Super.class); s.delete(); }}class Manager{ public void root() { System.out.println("执行root"); }}class Super{ public void delete() { System.out.println("执行删除操作!"); }}class ManagerProxy implements MethodInterceptor{ private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<?> clazz) { enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("截拦!"); proxy.invokeSuper(obj, args); System.out.println("保存!"); return null; } } |
来源:https://www.cnblogs.com/lijianming180/p/12099773.html