码迷,mamicode.com
首页 > 编程语言 > 详细

java中的动态代理机制

时间:2016-02-29 23:19:53      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:

java中的动态代理机制

  在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。下面通过代码来学习java中的动态代理技术.

  首先定义一个接口:

package com.aop.spring;

/**
 * Created by xinfengyao on 16-2-29.
 */
public interface Perform {
    public void play();
}

  实现该接口:

package com.aop.spring;

/**
 * Created by xinfengyao on 16-2-29.
 */
public class Actor implements Perform {
    @Override
    public void play() {
        System.out.println("开始表演");
    }
}

  实现InvocationHandler:

package com.aop.spring;

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

/**
 * Created by xinfengyao on 16-2-29.
 */
public class MyHandler implements InvocationHandler {
  // 这个就是我们想要代理的真实对象 Perform performer;
public MyHandler(Perform performer) { this.performer = performer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     // 在代理的真实对象执行操作前, 我们可以执行自己的操作 System.out.println(
"表演开始之前,开灯");
     
     // 真实对象执行操作 Object object
= method.invoke(performer, args);

     //在真实对象执行完操作后, 我们也可以加上我们自己的操作 System.out.println(
"表演结束, 关灯"); return object; } }

  创建代理,调用方法:

package com.aop.spring;

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

/**
 * Created by xinfengyao on 16-2-29.
 */
public class ProxyDemo {
    public static void main(String[] args) {
        Perform performer = new Actor();

        InvocationHandler handler = new MyHandler(performer);
        Perform proxy = (Perform) Proxy.newProxyInstance(performer.getClass().getClassLoader(), performer.getClass().getInterfaces(), handler);
        proxy.play();

    }
}

运行结果:

表演开始之前,开灯
开始表演
表演结束, 关灯

 

  首先需要创建委托类对象,也就是我们想要代理的对象, 例如实例中的performer,  将其以构造函数传入代理处理器,代理处理器ProxyHandler中会以Java反射方式调用该委托类对应的方法。然后使用 Java反射机制中的Proxy.newProxyInstance方式创建一个代理类实例,创建该实例需要指定该实例的类加载器,需要实现的接口(即目 标接口),以及处理代理实例接口调用的处理器。

  最后,调用代理类目标接口方法时,会自动将其转发到代理处理器中的invoke方法内,invoke方法内部实现预处理,对委托类方法调用,事后处理等逻辑。

 

java中的动态代理机制

标签:

原文地址:http://www.cnblogs.com/NewMan13/p/5229199.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!