1 package com.example.demo; 2 3 public interface IWrite { 4 //写 5 void write(); 6 }
1 package com.example.demo; 2 3 public class Author implements IWrite { 4 @Override 5 public void write() { 6 System.out.println("writing"); 7 } 8 }
package com.example.demo; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AuthorProxy implements InvocationHandler { private Object target; public Object bind(Object target) { this.target = target; //接收业务实现类对象参数 //通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用 //创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,在包装方法是调用真正的业务方法)、接口、handler实现类 return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); method.invoke(target,args); System.out.println("after"); return null; } public static void main(String args[]) { Author write = new Author(); AuthorProxy authorProxy = new AuthorProxy(); IWrite author = (IWrite) authorProxy.bind(write); author.write(); } }
package com.example.demo; public class AuthorNoImplements { public void write() { System.out.println("writing..."); } }
package com.example.demo; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibProxy implements MethodInterceptor { private Object target; // 这里的目标类型为Object,则可以接受任意一种参数作为被代理类,实现了动态代理 public Object bind(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before"); Object obj = method.invoke(target, objects); System.out.println("after"); return obj; } public static void main(String args[]) { CglibProxy cglibProxy = new CglibProxy(); AuthorNoImplements authorNoImplements = (AuthorNoImplements) cglibProxy.bind(new AuthorNoImplements()); authorNoImplements.write(); } }
CGlib动态代理是通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理;
如对本文有疑问, 点击进行留言回复!!
详解SpringBoot修改启动端口server.port的四种方式
网友评论