动态代理的简单实现

动态代理简单实例

动态代理可以对目标对象进行增强,但必须得实现一个接口

(1) 被代理的类

package entity;

public class Person implements Strong{

    @Override
    public void howToStrong() {
        System.out.println("如何才能变强");
    }
}

(2) 实现的接口

package entity;

public interface Strong {
    void howToStrong();
}

(3)动态代理实现


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

public class PersonProxy {

    public static Object toStrong(Object target){
        // 类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        // 被代理对象实现的接口
        Class[] interfaces = target.getClass().getInterfaces();
        // new InvocationHandler() 执行的方法
        Object o = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
            /**
             *
             * @param proxy 调用这个方法的代理实例
             * @param method 需要调用的方法
             * @param args 方法调用时所需要的参数
             * @return java.lang.Object
             * @author melo、lh
             * @createTime 2020-04-03 17:09:09
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("996");
                Object invoke = method.invoke(target, args);
                System.out.println("变秃");
                return invoke;
            }
        });
        return o;
    }
}

lambda简化

  Object o = Proxy.newProxyInstance(classLoader, interfaces, (proxy, method, args) ->{
            System.out.println("996");
            Object invoke = method.invoke(target, args);
            System.out.println("变秃");
            return invoke;
        });

(4)测试类

package entity;

public class Test {
    public static void main(String[] args) {
        Strong strong   = (Strong) PersonProxy.toStrong(new Person());
        strong.howToStrong();
    }
}

结果展示动态代理的简单实现_第1张图片

你可能感兴趣的:(设计模式,java,设计模式)