java中的动态代理机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的动态代理机制相关的知识,希望对你有一定的参考价值。

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中的动态代理机制的主要内容,如果未能解决你的问题,请参考以下文章

java动态代理机制

#yyds干货盘点# 设计模式之代理模式:动态代理

深入理解java动态代理的实现机制

java反射机制动态代理初探

java代理机制简单实现

JAVA的动态代理机制