java动态代理实现demo

Posted 徐敬哲

tags:

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

1.创建接口:

/**
 * @author JingZhe  @time 2021/10/20 9:45
 */
public interface Person {
    /** 测试方法 */
    void doSomething();
}

2.创建接口的实现类:

/**
 * @author JingZhe  @time 2021/10/20 9:48
 */
public class JingZhe implements Person {

    @Override
    public void doSomething() {
        System.out.println("jingZhe doing Something");
    }
}

3.创建动态代理类:

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

/**
 * @author JingZhe  @time 2021/10/20 9:44
 */
public class JDKDynamicProxy implements InvocationHandler {

    /** 声明被代理的对象 */
    private Person person;

    /** 构造函数 */
    public JDKDynamicProxy(Person person) {
        this.person = person;
    }

    /** 获取代理对象 */
    public Object getProxy() {
        Object proxyInstance = Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
        return proxyInstance;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("对原方法进行了前置增强");
        // 原方法执行
        Object invoke = method.invoke(person, args);
        System.out.println("对原方法进行了后置增强");
        return invoke;
    }
}

4.编写测试类:

/**
 * @author JingZhe  @time 2021/10/20 9:46
 */
public class proxyTest {
    public static void main(String[] args) {

        System.out.println("不使用代理类,调用doSomething");
        Person person = new JingZhe();
        person.doSomething();

        System.out.println("--------------------------");

        System.out.println("使用代理类,调用doSomething");
        Person proxy = (Person) new JDKDynamicProxy(new JingZhe()).getProxy();
        proxy.doSomething();

    }
}

测试结果:

不使用代理类,调用doSomething
jingZhe doing Something
--------------------------
使用代理类,调用doSomething
对原方法进行了前置增强
jingZhe doing Something
对原方法进行了后置增强

以上。

java 动态代理 demo 实现原理 参数理解

 

动态代理两个重要的组成:   Proxy   与   InvocationHandler

Hello1  hello = (Hello1) Proxy.newProxyInstance(Hello.class.getClassLoader(),new Class[]Hello1.class,new HelloProxy<HelloWorld>(new HelloWorld()));

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)

第一个类加载器,  目前觉得这个理解的不到位,因为要生成一个在内存中的代理对象,需要一个类加载器器,平常

第二个参数,被代理对象的所有接口,假如 hello 实现了 Hello 、 Hello1  这两个接口,这个参数 就变数,两个接口组成的 class数组, 参数的目的是: 本质上其实是多态,  这样

Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), this);  这个方法可以 强制转换成Hello  也可以是 Hello1

第三个参数  这个参数 要实现 InvocationHandler 接口

 

InvocationHandler   要实现的方法如下:


public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 

三个参数: proxy  这个感觉没有用上

这样的是第二个参数:  method  这个是被代理类的接口层的实现方法的Class 对象,比如有个方法 sayHello 这个就是sayHello 的class 对象,然后通过反射机制 去调用这个方法

第三个参数  就是方法使用到的参数

 

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

通过最小实现demo来介绍mybaits动态代理

动态代理—— CGLIB代理原理

JAVA之AOP

动态代理

动态代理

JAVA动态代理学习