Java 动态代理的两种方式实例
2017-08-18 22:57
281 查看
package top.yuyufeng.test.dynamicProxy; /** * created by yuyufeng on 2017/8/18. */ public interface HelloService { String hello(String words); }
package top.yuyufeng.test.dynamicProxy; /** * created by yuyufeng on 2017/8/18. */ public class HelloServiceImpl implements HelloService { @Override public String hello(String words) { System.out.println("Hello:" + words); return "Hello:" + words; } }
package top.yuyufeng.test.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * created by yuyufeng on 2017/8/18. */ public class ProxyHandler implements InvocationHandler { private Object proxied; public ProxyHandler(Object object) { this.proxied = object; } public Object invoke(Object object, Method method, Object[] args) throws Throwable { /** * ①Object proxy:代理对象引用。 * ②Method method:代理类中接受的接口方法。 * ③Object[] args:向代理对象的方法中传递的参数。 */ System.out.println("<执行方法之前>"); Object result = method.invoke(proxied, args); System.out.println("<执行方法之后>"); return result; } }
使用:
package top.yuyufeng.test.dynamicProxy; import java.lang.reflect.Proxy; /** * created by yuyufeng on 2017/8/18. */ public class App { public static void main(String[] args) { /** * ①ClassLoader loader : 定义代理类的类加载器,可获得已知的加载器。 * ②Class<?> interfaces : 希望代理代理实现的接口列表,它可以是多个接口。 * ③InvocationHandler h : InvocationHandler接口的一个具体实现类的对象的引用(需传入被代理类实例对象的引用)。 */ HelloServiceImpl helloServiceImpl = new HelloServiceImpl(); HelloService helloService = (HelloService) Proxy.newProxyInstance(HelloService.class.getClassLoader(), new Class[]{HelloService.class}, new ProxyHandler(helloServiceImpl)); helloService.hello("yyf"); } }
执行结果:
<执行方法之前> Hello:yyf <执行方法之后>
cglib动态代理方式
package demo; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Created by yuyufeng on 2017/8/31. */ public class CglibProxy 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 o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置代理"); //通过代理类调用父类中的方法 Object result = methodProxy.invokeSuper(o, objects); System.out.println("后置代理"); return result; } }
相关文章推荐
- Java实现动态代理的两种方式
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- java动态代理的两种方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Java中三种代理方式—— 静态代理与两种动态代理的实现机制
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- java动态代理的两种实现方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载
- 转:Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- Java实现动态代理的两种方式
- java动态代理的两种方式---jdk和cglib
- Java 动态代理实现的两种方式