Java动态代理简易说明

简介: Java动态代理简易说明

先看一下java.lang.reflect.Proxy的实例化方法声明

/**
     ...
     * @param   loader the class loader to define the proxy class
     * @param   interfaces the list of interfaces for the proxy class
     *          to implement
     * @param   h the invocation handler to dispatch method invocations to
     * @return  a proxy instance with the specified invocation handler of a
     *          proxy class that is defined by the specified class loader
     *          and that implements the specified interfaces
  ...
*/
    @CallerSensitive
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)

显然,实例化一个Proxy对象需要传三个参数:

ClassLoader 类加载器
Class<?>[] 类型数组,这里只能传接口数组,决定了生成的代理对象可以转换成的类型
InvocationHandler 实际代理处理类

然后我们再看InvocationHandler的接口方法

/**
     ...
     * @param   proxy the proxy instance that the method was invoked on
     *
     * @param   method the {@code Method} instance corresponding to
     * the interface method invoked on the proxy instance.  The declaring
     * class of the {@code Method} object will be the interface that
     * the method was declared in, which may be a superinterface of the
     * proxy interface that the proxy class inherits the method through.
     ...
     */
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;

显然,invoke方法有三个参数:

Object proxy 代理实例,这里实际上是代理实例把自己作为参数传递了,只能用作类型判断,否则会产生循环嵌套调用,导致栈溢出
Method method 方法实例,这里需要了解反射的知识,其是proxy调用的任何方法的方法实例
Object[] args 这个是proxy调用方法时传递的实例

由此看出,仅仅实现了InvocationHandler的类没有任何用处,因为Method的调用需要一个实现该方法的类实例

/**
     ...
     * @param obj  the object the underlying method is invoked from
     * @param args the arguments used for the method call
     * @return the result of dispatching the method represented by
     * this object on {@code obj} with parameters
     ...
     */
    @CallerSensitive
    public Object invoke(Object obj, Object... args)

好了,方法基本说完了,下面是重点中的重点:

代理实例方法(任何方法)的调用,都是通过InvocationinHandler的Invoke()调用的,InvocationinHandler处理的粒度是方法。

下面是例子

首先是要被代理的接口和接口的实现

public interface IMethodInvoke {
   
    public void psvm();
}
public class MethodInvoke implements IMethodInvoke{
   
    public MethodInvoke() {
   
    }
    public void psvm() {
   
        System.out.println("psvm方法调用!");
    }

}

然后是InvocationinHandler

public class MessageHandler implements InvocationHandler{
   
    private Object cli;
    public MessageHandler(Object cli) {
   
        this.cli=cli;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
        System.out.println("发送信息");
        return  method.invoke(cli, args);
    }

}

最后是Main

public static void main(String[] args) {
   
    IMethodInvoke imi = new MethodInvoke();
    InvocationHandler ivh = new MessageHandler(imi);
    IMethodInvoke proxy = (IMethodInvoke)Proxy.newProxyInstance(imi.getClass().getClassLoader(), imi.getClass().getInterfaces(), ivh);
    User user = new User();
    Class[] users = {
   User.class}; 
    User userProxy = (User)Proxy.newProxyInstance(imi.getClass().getClassLoader(), users, ivh);
    proxy.psvm();//作为ivh的Invoke方法的参数中的Method,和Object[],Proxy则是代理实例本身
    System.out.println("Out"+proxy.toString());
}
目录
相关文章
|
4月前
|
缓存 安全 Java
Java中动态代理使用与原理详解
Java中动态代理使用与原理详解
53 0
|
4月前
|
Java
Java之动态代理的详细解析
2. 动态代理 2.1 好处: 无侵入式的给方法增强功能 2.2 动态代理三要素: 1,真正干活的对象
38 0
|
4月前
|
Java
【Java动态代理】—— 每天一点小知识
【Java动态代理】—— 每天一点小知识
|
5月前
|
Arthas Dubbo Java
Alibaba Java诊断工具Arthas查看Dubbo动态代理类
Alibaba Java诊断工具Arthas查看Dubbo动态代理类
55 0
|
4天前
|
设计模式 Java 索引
由反射引出的Java动态代理与静态代理
由反射引出的Java动态代理与静态代理
12 0
|
9天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
1月前
|
Java API 开发者
Java代理模式——静态代理与动态代理
Java代理模式——静态代理与动态代理
27 1
|
1月前
|
监控 Java 程序员
java的动态代理如何实现
java的动态代理如何实现
25 0
|
2月前
|
设计模式 Java 程序员
Java动态代理
Java动态代理详解
|
2月前
|
设计模式 Java API
[Java]静态代理、动态代理(基于JDK1.8)
本篇文章主要是对静态代理和动态代理实现思路的简述,以示例为主,少涉及理论。 如果文中阐述不全或不对的,多多交流。
54 1
[Java]静态代理、动态代理(基于JDK1.8)