Java dynamic proxy 从使用到深入

Java 动态代理源码分析

接口及代理类

接口
package cn.jastz.java.reflect.dynamic.proxy;

/**
 * @author zhiwen
 */
public interface Foo {
    void bar();
    void rtest();
    void rtest1();
    void rtest2();
}
代理类
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.sun.proxy;

import cn.jastz.java.reflect.dynamic.proxy.Foo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;

public final class $Proxy0 extends Proxy implements Foo {
    private static Method m1;
    private static Method m4;
    private static Method m5;
    private static Method m2;
    private static Method m6;
    private static Method m3;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }

    public final boolean equals(Object var1) throws  {
        try {
            return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final void rtest1() throws  {
        try {
            super.h.invoke(this, m4, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void rtest2() throws  {
        try {
            super.h.invoke(this, m5, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void bar() throws  {
        try {
            super.h.invoke(this, m6, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void rtest() throws  {
        try {
            super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m4 = Class.forName("cn.jastz.java.reflect.dynamic.proxy.Foo").getMethod("rtest1");
            m5 = Class.forName("cn.jastz.java.reflect.dynamic.proxy.Foo").getMethod("rtest2");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m6 = Class.forName("cn.jastz.java.reflect.dynamic.proxy.Foo").getMethod("bar");
            m3 = Class.forName("cn.jastz.java.reflect.dynamic.proxy.Foo").getMethod("rtest");
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

为什么不能代理类?

因为生成的代理类是继承java.lang.reflect.Proxy类、实现被代理接口,因为java是单继承,所以可想而知是不能代理类的,并且运行的时候有做相关的校验的。

用途

编码步骤

  • 定义被代理接口、被代理接口实现类[可选的]
  • 定义 InvocationHandler
  • 创建代理对象:Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

动态代理类class文件生成

sun.misc.ProxyGenerator.generateProxyClass(java.lang.String, java.lang.Class<?>[], int)  
sun.misc.ProxyGenerator.generateClassFile() 

需要生成代理类class文件需要添加如下配置:

System.getProperties().put(
                "sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

和设计模式——代理模式的关系

参考

1.JDK动态代理源码分析

转载于:https://my.oschina.net/jast90/blog/3082284

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值