Java代理示例:静态代理、jdk动态代理、cglib动态代理 Bertha 。 2022-02-23 01:54 306阅读 0赞 # 1 接口及其实现 # public interface Greeting { void sayHello(String name); } --------------------------------------------- public class GreetingImpl implements Greeting { @Override public void sayHello(String name) { System.out.println( "Hello! " + name ); } } # 2 静态代理 # public class GreetingProxy implements Greeting { private GreetingImpl greeting; public GreetingProxy(GreetingImpl greeting){ this.greeting = greeting; } @Override public void sayHello(String name) { before(); greeting.sayHello(name); after(); } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); } } # 3 JDK动态代理 # import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 1. 首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。 public class JDKDynamicProxy implements InvocationHandler { // 目标对象 private Object target; public JDKDynamicProxy(Object target){ this.target = target; } // 2. 然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。 @SuppressWarnings("unchecked") public <T>T getProxy() { // 会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法 return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), // 指定代理对象的类加载器; target.getClass().getInterfaces(), // 代理对象需要实现的接口,可以同时指定多个接口 this // 自定义的InvocationHandler,即方法调用的实际处理者,代理对象的方法调用都会转发到这里 ); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); // 前置处理 Object result = method.invoke(target,args); after(); // 后置处理 return result; } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); } } # 4 CGLIB动态代理 # ## 4.1 pom.xml ## <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency> ## 4.2 Java实现 ## 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 CGLibDynamicProxy implements MethodInterceptor { private static CGLibDynamicProxy instance = new CGLibDynamicProxy(); private CGLibDynamicProxy(){ } public static CGLibDynamicProxy getInstance(){ return instance; } @SuppressWarnings("unchecked") public <T>T getProxy(Class<T> cls) { return (T) Enhancer.create(cls,this); } @Override public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); Object result = proxy.invokeSuper(target,args); after(); return result; } private void before(){ System.out.println("Before"); } private void after(){ System.out.println("After"); } } # 5 测试代码 # public class MainProxy { public static void main(String[] args) { // staitcProxy(); jdkDynamicProxy(); // cglibDynamicProxy(); } private static void staitcProxy(){ Greeting greeting = new GreetingProxy(new GreetingImpl()); greeting.sayHello("jtzen9"); } private static void jdkDynamicProxy(){ JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(new GreetingImpl()); Greeting greeting = jdkDynamicProxy.getProxy(); greeting.sayHello("jtzen9"); } private static void cglibDynamicProxy(){ Greeting greeting = CGLibDynamicProxy.getInstance().getProxy(GreetingImpl.class); greeting.sayHello("jtzen9"); } }
还没有评论,来说两句吧...