[原创] java 代理机制_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4710 | 回复: 0   主题: [原创] java 代理机制        下一篇 
    本主题由 522080330 于 2013-1-23 16:15:50 置为精华
522080330
注册用户
等级:少校
经验:1478
发帖:79
精华:20
注册:2013-1-18
状态:离线
发送短消息息给522080330 加好友    发送短消息息给522080330 发消息
发表于: IP:您无权察看 2013-1-21 16:24:17 | [全部帖] [楼主帖] 楼主


例1.静态代理
定义接口:Count.java

package proxy.StaticProxy;
//定义一个账户接口
public interface Count {
      // 查看账户方法
      public void queryCount();
      // 修改账户方法
      public void updateCount();
}


接口实现:CountImpl.java

package proxy.StaticProxy;
public class CountImpl implements Count {
      @Override
      public void queryCount() {
            System.out.println("查看账户方法...");
      }
      @Override
      public void updateCount() {
            System.out.println("修改账户方法...");
      }
}


代理类CountProxy.java



 package proxy.StaticProxy;
// 这是一个代理类(增强CountImpl实现类)
public class CountProxy implements Count {
      private CountImpl countImpl;
      public CountProxy(CountImpl countImpl) {
            this.countImpl = countImpl;
      }
      public void queryCount() {
            System.out.println("事务处理之前");
            // 调用委托类的方法;
            countImpl.queryCount();
            System.out.println("事务处理之后");
      }
      @Override
      public void updateCount() {
            System.out.println("事务处理之前");
            // 调用委托类的方法;
            countImpl.updateCount();
            System.out.println("事务处理之后");
      }
}


测试类 Test.java


package proxy.StaticProxy;

 public class Test {
      public static void main(String args[]) {
            CountImpl countImpl = new CountImpl();
            CountProxy countProxy = new CountProxy(countImpl);
            countProxy.updateCount();
            countProxy.queryCount();
      }


}


运行结果:
事务处理之前
修改账户方法...
事务处理之后
事务处理之前
查看账户方法...
事务处理之后


例2.动态代理

 Animal.java
package proxy.DynamicProxy_JDK_2;
public interface Animal {
      public void info();
}
Cat.java
package proxy.DynamicProxy_JDK_2;
public class Cat implements Animal {
      @Override
      public void info() {
            System.out.println("我是一只猫!!喵");
      }
}
Handler.java
package proxy.DynamicProxy_JDK_2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Handler implements InvocationHandler {
      private Object target;
      public Handler(Object target) {
            this.target = target;
      }
      @Override
      public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
            System.out.println("被拦截的方法:" + method.getName());
            System.out.println("预处理.........");
            Object result = method.invoke(target, args);
            System.out.println("善后处理........");
            return result;
      }
}
Test.java
package proxy.DynamicProxy_JDK_2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Test {
      public static void main(String[] args) {
            // 委托对象
            Animal animal = new Cat();
            // 为animal制定一个调用处理器
            InvocationHandler handler = new Handler(animal);
            // 获得真实对象(animal)的一个代理类 ★★★★★
            // 参数:(真实对象的类加载器,真实对象实现的所有接口,真实对象的处理器)
            Object proxyObj = Proxy.newProxyInstance(animal.getClass()
            .getClassLoader(), animal.getClass().getInterfaces(), handler);
            // 应用代理对象
            if (proxyObj instanceof Animal) {
                  System.out.println("proxyObj是animal!");
                  Animal animalProxy = (Animal) proxyObj;
                  animalProxy.info();// 像普通animal对象一样使用(通过handler的invoke方法执行)
            } else {
            System.out.println("proxyObj不是animal!");
      }
}
}



运行结果:

proxyObj是animal!
被拦截的方法:info
预处理.........
我是一只猫!!喵
善后处理........



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论