java的动态代理(AOP)

来源:互联网 发布:asp网上报修系统 源码 编辑:程序博客网 时间:2024/06/04 23:30

代理分为两种:一种是实现接口的java动态代理,一种为不实现接口的代理是基于CGLIB实现的。

 

 Proxy提供了用于创建动态代理类和动态代理对象的 静态方法,它也是所有动态代理的父类,

下面通过简单的 实例介绍Dynamic Proxy:

Dog:

public interface Dog {
 public void info();
 public void run();
}

 

Dog的实现类:

public class DogImpl implements Dog{

 public void info() {
  
  System.out.println("我是一只猎狗");
 }

 public void run() {
  System.out.println("我跑的非常快");
  
 }
}

 

public class DogUtil {

 public void method1(){
  System.out.println("==========模拟第一个通用方法==========");
 }
 public void method2(){
  System.out.println("==========模拟第二个通用方法==========");
 }
}

 

/**
 * 该类是一个InvocationHandler的实现类,该类的invoke方法将作为代理对象的方法实现
 */
public class MyInvocationHandler implements InvocationHandler {

 /**需要被代理的对象*/
 private Object target;
 
 public void setTarget(Object target) {
  this.target = target;
 }

 /**执行动态代理对象的所有方法,都会被替换成执行如下的invoke方法*/
 public Object invoke(Object proxy, Method method, Object[] args)
   throws Throwable {
  DogUtil dogUtil = new DogUtil();
  dogUtil.method1();
  
  Object result = method.invoke(target, args);
  
  dogUtil.method2();
  return result;
 }

}

 

/**
 * 专为指定的target生成动态代理实例
 */
public class MyProxyFactory {
 //注意Proxy提供了两种方法来创建动态代理类和动态代理实例,如:
 
 public static Object getProxyInstance(Object target) {
  MyInvocationHandler handler = new MyInvocationHandler();
  handler.setTarget(target);
  /*创建并返回动态代理*/
  return Proxy.newProxyInstance(target.getClass().getClassLoader(),
    target.getClass().getInterfaces(), handler);
 }
 public static Object getProxyClass(Object target) throws Exception {
  MyInvocationHandler handler = new MyInvocationHandler();
  handler.setTarget(target);
  /*创建并返回动态代理*/
  Class clazz = Proxy.getProxyClass(target.getClass().getClassLoader(), target.getClass().getInterfaces());
  Constructor con = clazz.getConstructor(new Class[]{InvocationHandler.class});
  return con.newInstance(new Object[]{handler});
 }
}

 

测试:

public class Test {

 public static void main(String[] args) throws Exception {
  Dog target = new DogImpl();
  //Dog dog = (Dog)MyProxyFactory.getProxyClass(target);
  Dog dog = (Dog)MyProxyFactory.getProxyInstance(target);
  dog.info();
  dog.run();
 }
}

 

输出结果:

==========模拟第一个通用方法==========
我是一只猎狗
==========模拟第二个通用方法==========
==========模拟第一个通用方法==========
我跑的非常快
==========模拟第二个通用方法==========

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信照片电脑上打不开怎么办 换一部手机微信怎么办 微信支付宝停止运行怎么办 剑三重制版卡顿怎么办 剑三客户端更新不动了怎么办 安装包安装失败怎么办有内存 qq飞车换手机了怎么办 qq飞车求婚失败戒指怎么办 改脸型皮肤会下垂怎么办 情侣关系弄僵了怎么办 用微信交话费没有到账怎么办 微信交错话费了怎么办 微信缴费交错了怎么办 微信支付被投诉怎么办 微信q币充值错误怎么办 微信充值流量充错了怎么办 微信延迟到账怎么办 移动流量充错了怎么办 qq充话费等待发货怎么办 qq充值话费没到账怎么办 电信话费冲错了怎么办 微信手机充错话费充空号怎么办 京东地址写错了怎么办 京东售后不退款怎么办 冲了话费不到账怎么办 币安维护充值怎么办 微信话费未到账怎么办 微信话费交错了怎么办 北京移动查话费余额怎么办 淘宝卖家客服无法联系怎么办? 微信支付月限额怎么办 微信超额20万怎么办 微信支付超额了怎么办 微信零钱超额了怎么办 微信的充值冲错了怎么办 有流量还扣话费怎么办 自动取款机充值到电子账户怎么办 淘宝qb充错了怎么办 q币冲错了人家不给怎么办 qq充值话费错号怎么办 qq充错号码了怎么办