动态代理示例

来源:互联网 发布:天龙八部男的染发数据 编辑:程序博客网 时间:2024/06/08 13:05

动态代理只对接口有效!!!


示例接口:

public interface Student {    void login ();    void submit ();}   


示例接口的实现类:

public class StudentImp implements Student {    @Override    public void login () {        System.out.println ("登录了,");    }    @Override    public void submit () {        System.out.println ("提交了");    }}

要点:

定义实现自己的InvocationHandler类:

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/** * Created by Void Young on 5:15 PM 7/26/2016 . * IDEA-Test . * 对于這里的运行机制,还未理解, * 比如method对象是怎么获取到的? * args参数又是从哪里传入? */public class MyInvocationHandler implements InvocationHandler {    Object target;    public MyInvocationHandler (Object target) {        this.target = target;//要被代理的对象    }    @Override    public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {        System.out.println ("来呀,互相伤害呀");//此处为被代理方法运行前 要添加实现的内容                method.invoke (target, args);  //执行被代理的target的方法method ,不定长参数args是该方法是实参                System.out.println ("我艹");//此处为被代理方法运行后 要添加实现的内容        return null;    }}


测试类:

import java.lang.reflect.Proxy;/** * Created by Void Young on 5:19 PM 7/26/2016 . * IDEA-Test . */public class TestDTDL {    public static void main (String[] args) {        StudentImp si = new StudentImp ();        si.login ();        si.submit ();        System.out.println ("------华丽的分割线---------");        MyInvocationHandler mih = new MyInvocationHandler (si);//new一个自己的InvocationHandler        Student s       =// 只支持接口用接口的实例接收结果                   (Student)//结果需要强转类型                        Proxy.newProxyInstance (                                si.getClass ().getClassLoader (), //传入代理对象的classloader                                 si.getClass ().getInterfaces (), //  代理对象的接口类                                  mih);//自定义的InvocationHandler        s.login ();        s.submit ();    }}




运行实例:



0 0
原创粉丝点击