java动态代理

Posted 番茄酱料

tags:

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

work:

public interface Work 
    public String work();


Teacher:

public class Teacher implements Work

    @Override
    public String work() 
        System.out.println("my work is teach students");
        return "Teacher";
    


WorkHandler:

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

public class WorkHandler implements InvocationHandler 
    //代理类中的真实对象
    private Object obj;
    //构造函数,给我们的真实对象赋值
    public WorkHandler(Object obj)
        this.obj = obj;
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable 
        //在真实的对象执行之前我们可以添加自己的操作
        System.out.println("before invoke...");
        //java的反射功能,用来调用obj对象的method方法,传入参数为args
        Object invoke = method.invoke(obj,args);
        //在真实的对象执行之后我们可以添加自己的操作
        System.out.println("after invoke...");
        return invoke;
    


Test:

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

public class Test 
    public static void main(String[] args) 
        //要代理的真实对象
        Work people = new Teacher();
        //代理对象的调用处理程序,我们将要代理的真实对象传入代理对象的调用处理的构造函数中,最终代理对象的调用处理程序会调用真实对象的方法
        InvocationHandler handler = new WorkHandler(people);
        /**
         * 通过Proxy类的newProxyInstance方法创建代理对象,我们来看下方法中的参数
         * 第一个参数:people.getClass().getClassLoader(),使用handler对象的classloader对象来加载我们的代理对象
         * 第二个参数:people.getClass().getInterfaces(),这里为代理类提供的接口是真实对象实现的接口,这样代理对象就能像真实对象一样调用接口中的所有方法
         * 第三个参数:handler,我们将代理对象关联到上面的InvocationHandler对象上
         */
        Work proxy = (Work) Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(),handler);
        System.out.println(proxy.work());

    


结果:

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

java动态代理是啥

java-动态代理

Java 设计模式之代理模式,Java 静态代理,Java 动态代理

Java动态代理实现方式一

(java反射-JDK动态代理)+CGLIB动态代理

java动态代理源码解析