教程集 www.jiaochengji.com
教程集 >  脚本编程  >  java  >  正文 Java笔记之对象代理实例

Java笔记之对象代理实例

发布时间:2016-11-26   编辑:jiaochengji.com
教程集为您提供Java笔记之对象代理实例等资源,欢迎您收藏本站,我们将为您提供最新的Java笔记之对象代理实例资源
简介即ProxyPattern,23种java常用设计模式之一。代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问,下面我们一起来看看Java对象代理的一些笔记吧。
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1364')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1364>

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;


//代理需要实现的接口
interface IVehical {

    //例如我这里写了两个接口
    void run();
    void say();
}

//concrete implementation
 class Car implements IVehical{

    //下面这两个方法,作为接口的实现方法,如果接口中没有这些方法,而在这里出现了多余的方法程序将编译不过。
    //每次调用这两个方法都会触发代理对象中的invoke方法。
    public void run() {
    System.out.println("Car is running");
    }
   
    public void say()
    {
        System.out.println("just one!");
    }

}

//proxy class
//这个类是用来创建代理对象的,这里只是对它进行了简单的封装
class VehicalProxy {

    private IVehical vehical;

    public VehicalProxy(IVehical vehical) {
    this.vehical = vehical;
    }
    //这个方法返回创建后的对象代理
    public IVehical create(){
    final Class<?>[] interfaces = new Class[]{IVehical.class};
    final VehicalInvacationHandler handler = new VehicalInvacationHandler(vehical);
   
    return (IVehical) Proxy.newProxyInstance(IVehical.class.getClassLoader(), interfaces, (InvocationHandler) handler);
    }
    //这个是跟代理对象绑定的一个处理器,www.jiaochengji.com每次调用对象代理中的方法都会触发这个处理器中的invoke方法
    class VehicalInvacationHandler implements InvocationHandler{

    private final IVehical vehical;
   
    public VehicalInvacationHandler(IVehical vehical) {
        this.vehical = vehical;
    }

    //每当执行对象代理的say或者call(只要是IVehical接口中的方法)就会触发invoke被执行
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {

        System.out.println("--before running...");
        Object ret = method.invoke(vehical, args);
        System.out.println("--after running...");
       
        return ret;
    }
   
    }
}

class Main {
    public static void main(String[] args) {
   
    IVehical car = new Car();
    VehicalProxy proxy = new VehicalProxy(car);
   
    IVehical proxyObj = proxy.create();
    proxyObj.say();
    }
}

/*
 * 程序运行之后将打印如下信息,因此我们可以看出对象的代理可以往特定对象的方法中添加附带的执行代码,
 * 这个的作用在我们需要对一个做日志或者bug调试的时候非常有作用,因为我们不应该把调试代码或者是打
 * 印日志代码写在对象中,这样我们就可以将日志的代码添加到对象的代理中,从而将业务与程序的框架相
 * 关的功能分离,从而保证了代码的“纯净性”。
 * output:
 * --before running...
 * Car is running
 * --after running...
 * */

您可能感兴趣的文章:
Java笔记之对象代理实例
Java入门笔记1_HelloWorld
java中ormlite 学习笔记
Java中java.lang.Void类学习笔记
笔记本进水开不了机怎么处理?维修多少钱?
Golang垃圾回收机制
AOP编程入门--Java篇
学习J2SE过程中的30个基本概念
java常量与变量的学习笔记
JNDI 笔记(一) 概述

[关闭]
~ ~