设计模式之动态代理

来源:互联网 发布:钢结构优化设计 编辑:程序博客网 时间:2024/05/16 08:37

一、java编程思想反射章节的动态代理实现代码展示

package com.lattice.dtagency;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;interface Person{    void doSomeThing();    void doSomeThingElse(String arg);}class Peter implements Person{    @Override    public void doSomeThing() {        System.out.println("Peter likes fishing!");    }    @Override    public void doSomeThingElse(String arg) {        System.out.println("Peter else likes swimming!"+arg);    }}class Merry implements Person{    @Override    public void doSomeThing() {        System.out.println("Merry likes dancing!");    }    @Override    public void doSomeThingElse(String arg) {        System.out.println("Merry else likes watching movies!"+arg);    }}/** * 静态代理类 **/class Lucy implements Person{    private Person person;    public Lucy(Person person){        this.person=person;    }    public void getPerson(Person person){        this.person=person;    }    @Override    public void doSomeThing() {        this.person.doSomeThing();    }    @Override    public void doSomeThingElse(String arg) {        this.person.doSomeThingElse(arg);    }}/* * 动态代理类 */class Maria implements InvocationHandler{    private Object person;    public Maria(Object person){        this.person=person;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        System.out.println("\n_____person\t:"+person.getClass()+                "\nmethod:"+method+"\targs"+args);        if(args!=null){            for(Object arg:args){                System.out.println("+++++++"+arg);            }        }        return method.invoke(person, args);    }}public class Afgency {    public static void doWork(Person person){        person.doSomeThing();        System.out.println("******************");        person.doSomeThingElse("---------------------");    }    public static void main(String [] args){        //doWork(new Lucy(new Peter()));        //动态代理对象创建        Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader()                , new Class[]{Person.class}, new Maria(new Peter()));        doWork(person);    }}

二、结果展示

_____person :class com.lattice.dtagency.Peter
method:public abstract void com.lattice.dtagency.Person.doSomeThing() argsnull
Peter likes fishing!


_____person :class com.lattice.dtagency.Peter
method:public abstract void com.lattice.dtagency.Person.doSomeThingElse(java.lang.String) args[Ljava.lang.Object;@1a3a2a52
+++++++———————
Peter else likes swimming!———————

原创粉丝点击