JAVA代理机制详解

来源:互联网 发布:淘宝收货人搞笑名字 编辑:程序博客网 时间:2024/04/30 09:22

JAVA代理机制是十分重要的一种机制,代理是一种常用的设计模式,目的是为其他对象提供一个代理,从而控制对该对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。具体可应用于日志管理、安全等问题。

  • java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。

// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器static InvocationHandler getInvocationHandler(Object proxy) // 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象static Class getProxyClass(ClassLoader loader, Class[] interfaces) // 方法 3:该方法用于判断指定类对象是否是一个动态代理类static boolean isProxyClass(Class cl) // 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例static Object newProxyInstance(ClassLoader loader, Class[] interfaces,     InvocationHandler h)

  •  java.lang.reflect.InvocationHandler:这是调用处理器接口,InvocationHandler 的核心方法
// 该方法负责集中处理动态代理类上的所有方法调用。第一个参数是代理类实例,第二个参数是被调用的方法对象
// 第三个方法是调用参数。调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行Object invoke(Object proxy, Method method, Object[] args)
每个实例都会关联一个调用处理器对象,可以通过 Proxy 提供的静态方法 getInvocationHandler 去获得代理类实例的调用处理器对象。在代理类实例上调用其代理的接口中所声明的方法时,这些方法最终都会由调用处理器的 invoke 方法执行.
  • java.lang.ClassLoader:这是类装载器类
负责将类的字节码装载到 Java 虚拟机(JVM)中并为其定义类对象,然后该类才能被使用。Proxy 静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区别就是其字节码是由 JVM 在运行时动态生成的而非预存在于任何一个 .class 文件中。
  • 动态代理对象创建过程

// InvocationHandlerImpl 实现了 InvocationHandler 接口,并能实现方法调用从代理类到委托类的分派转发InvocationHandler handler = new InvocationHandlerImpl(..); // 通过 Proxy 直接创建动态代理类实例Interface proxy = (Interface)Proxy.newProxyInstance( classLoader,  new Class[] { Interface.class },  handler );

实例

接口

public interface ITalk{public void talk(String name);}


核心业务类:

public class TalkImpl implements ITalk{public void talk(String name){System.out.println("Hello,"+name);}}

动态代理类:

import java.lang.reflect.InvocationHandler;   import java.lang.reflect.Method;   import java.lang.reflect.Proxy;  public class DynimicProxy implements InvocationHandler{private Object object;public Object bind(Object object){this.object = object;return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable{Object result = null;try{System.out.println("method start...");result = method.invoke(object, args);System.out.println("method end...");}catch(Exception e){e.printStackTrace();}return result;}}

一切就绪,接下来测试
public class ProxyTest{public static void main(String[] args){DynimicProxy proxy = new DynimicProxy();ITalk talk = (ITalk)proxy.bind(new TalkImpl());talk.talk("hao");}}

结果:

method start...Hello,haomethod end...


0 0
原创粉丝点击