Java动态代理

Posted 蜡笔小斌

tags:

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

看java核心技术的时候,感觉动态代理没有理解好,于是查找了一些文档,写下这篇文章

首先,你需要熟悉代理模式,至少是静态代理,才可以很快理解这篇文章。

Dynamic Proxy是在运行时生成的class,在生成它时你必须提供一 组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实 例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy, 它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工 作。

A dynamic proxy class is a class that implements a list of interfaces specified at runtime such that a method invocation through one of the interfaces on an instance of the class will be encoded and dispatched to another object through a uniform interface. It can be used to create a type-safe proxy object for a list of interfaces without requiring pre-generation of the proxy class. Dynamic proxy classes are useful to an application or library that needs to provide type-safe reflective dispatch of invocations on objects that present interface APIs.

通过动态代理技术,可以很方便地实现类似Spring AOP一样的方法拦截器

public interface Foo 
    Object bar(Object obj) throws BazException;


public class FooImpl implements Foo 
    Object bar(Object obj) throws BazException 
        // ...
    


public class DebugProxy implements java.lang.reflect.InvocationHandler 

    private Object obj;

    public static Object newInstance(Object obj) 
        return java.lang.reflect.Proxy.newProxyInstance(
            obj.getClass().getClassLoader(),
            obj.getClass().getInterfaces(),
            new DebugProxy(obj));
    

    private DebugProxy(Object obj) 
        this.obj = obj;
    

    public Object invoke(Object proxy, Method m, Object[] args)
        throws Throwable
    
        Object result;
        try 
            System.out.println("before method " + m.getName());
            result = m.invoke(obj, args);
         catch (InvocationTargetException e) 
            throw e.getTargetException();
         catch (Exception e) 
            throw new RuntimeException("unexpected invocation exception: " +
                                       e.getMessage());
         finally 
            System.out.println("after method " + m.getName());
        
        return result;
    

参考文献

java代理机制
oracle doc

以上是关于Java动态代理的主要内容,如果未能解决你的问题,请参考以下文章

Spring动态代理

java设计模式之代理模式

Java动态代理

Java动态代理

Spring 静态代理+JDK动态代理和CGLIB动态代理

Java静态代理和iOS代理模式这两个概念的理解上的疑惑