JDK动态代理

动态代理

JDK动态代理

源码

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
    interface IHello {

        void sayHello();
    }
    static class Hello implements IHello {
        @Override
        public void sayHello() {
            System.out.println("hello");
        }
    }
    static class DynamicProxy implements InvocationHandler {

        Object originalObj;

        public DynamicProxy(Object originalObj) {
            this.originalObj = originalObj;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("say hello before");
            Object result = method.invoke(originalObj, args);
            System.out.println("say hello after");
            return result;
        }
    }
    public static void main(String[] args) {
        Hello hello = new Hello();
        DynamicProxy dynamicProxy = new DynamicProxy(hello);
        IHello helloProxy = (IHello) Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), dynamicProxy);
        helloProxy.sayHello();
    }
}

Class文件

javac -encoding UTF-8 DynamicProxyTest.java

DynamicProxyTest$IHello

interface DynamicProxyTest$IHello {
    void sayHello();
}

DynamicProxyTest$Hello


class DynamicProxyTest$Hello implements IHello {
    DynamicProxyTest$Hello() {
    }

    public void sayHello() {
        System.out.println("hello");
    }
}

DynamicProxyTest$DynamicProxy

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

class DynamicProxyTest$DynamicProxy implements InvocationHandler {
    Object originalObj;

    public DynamicProxyTest$DynamicProxy(Object var1) {
        this.originalObj = var1;
    }

    public Object invoke(Object var1, Method var2, Object[] var3) throws Throwable {
        System.out.println("say hello before");
        Object var4 = var2.invoke(this.originalObj, var3);
        System.out.println("say hello after");
        return var4;
    }
}

DynamicProxyTest

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
    public DynamicProxyTest() {
    }

    public static void main(String[] var0) {
        DynamicProxyTest.Hello var1 = new DynamicProxyTest.Hello();
        DynamicProxyTest.DynamicProxy var2 = new DynamicProxyTest.DynamicProxy(var1);
        DynamicProxyTest.IHello var3 = (DynamicProxyTest.IHello)Proxy.newProxyInstance(var1.getClass().getClassLoader(), var1.getClass().getInterfaces(), var2);
        var3.sayHello();
    }

    static class DynamicProxy implements InvocationHandler {
        Object originalObj;

        public DynamicProxy(Object var1) {
            this.originalObj = var1;
        }

        public Object invoke(Object var1, Method var2, Object[] var3) throws Throwable {
            System.out.println("say hello before");
            Object var4 = var2.invoke(this.originalObj, var3);
            System.out.println("say hello after");
            return var4;
        }
    }

    static class Hello implements DynamicProxyTest.IHello {
        Hello() {
        }

        public void sayHello() {
            System.out.println("hello");
        }
    }

    interface IHello {
        void sayHello();
    }
}

字节码

javap -c DynamicProxyTest$Hello

警告: 二进制文件DynamicProxyTest$Hello包含com.james.example.DynamicProxyTest$Hello
Compiled from "DynamicProxyTest.java"
class com.james.example.DynamicProxyTest$Hello implements com.james.example.DynamicProxyTest$IHello {
  com.james.example.DynamicProxyTest$Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public void sayHello();

javap -c DynamicProxyTest$DynamicProxy

警告: 二进制文件DynamicProxyTest$DynamicProxy包含com.james.example.DynamicProxyTest$DynamicProxy
Compiled from "DynamicProxyTest.java"
class com.james.example.DynamicProxyTest$DynamicProxy implements java.lang.reflect.InvocationHandler {
  java.lang.Object originalObj;

  public com.james.example.DynamicProxyTest$DynamicProxy(java.lang.Object);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0
       5: aload_1
       6: putfield      #2                  // Field originalObj:Ljava/lang/Object;
       9: return

  public java.lang.Object invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) throws java.lang.Throwable;
    Code:
       0: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #4                  // String say hello before
       5: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: aload_2
       9: aload_0
      10: getfield      #2                  // Field originalObj:Ljava/lang/Object;
      13: aload_3
      14: invokevirtual #6                  // Method java/lang/reflect/Method.invoke:(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
      17: astore        4
      19: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      22: ldc           #7                  // String say hello after
      24: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      27: aload         4
      29: areturn
}

javap -c DynamicProxyTest

Compiled from "DynamicProxyTest.java"
public class com.james.example.DynamicProxyTest {
  public com.james.example.DynamicProxyTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/james/example/DynamicProxyTest$Hello
       3: dup
       4: invokespecial #3                  // Method com/james/example/DynamicProxyTest$Hello."<init>":()V
       7: astore_1
       8: new           #4                  // class com/james/example/DynamicProxyTest$DynamicProxy
      11: dup
      12: aload_1
      13: invokespecial #5                  // Method com/james/example/DynamicProxyTest$DynamicProxy."<init>":(Ljava/lang/Object;)V
      16: astore_2
      17: aload_1
      18: invokevirtual #6                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      21: invokevirtual #7                  // Method java/lang/Class.getClassLoader:()Ljava/lang/ClassLoader;
      24: aload_1
      25: invokevirtual #6                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      28: invokevirtual #8                  // Method java/lang/Class.getInterfaces:()[Ljava/lang/Class;
      31: aload_2
      32: invokestatic  #9                  // Method java/lang/reflect/Proxy.newProxyInstance:(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;
      35: checkcast     #10                 // class com/james/example/DynamicProxyTest$IHello
      38: astore_3
      39: aload_3

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值