Java代理---JDK动态代理

本文介绍了Java中使用JDK动态代理实现类的方法,包括两种实现方式。第一种方式通过实现InvocationHandler接口创建代理类,第二种方式则是匿名内部类的方式。在每个示例中,代理类在调用实际业务方法前后添加了额外的操作,展示了动态代理在增强代码功能和提高健壮性方面的应用。
摘要由CSDN通过智能技术生成

需要实现 InvocationHandler接口

被代理类必须要实现自己的接口

特点:JDK实现动态代理需要实现类通过接口定义业务方法,
内部通过反射来实现代理功能,提高代码健壮性

实现方式一:

Service.java

interface Service {
        void sendmessage1 ();
        void sendmessage2 ();
    }

ServiceImpl.java

class ServiceImpl implements Service {
        public void sendmessage1 () {
            System.out.println("send message1");
        }

        public void sendmessage2 () {
            System.out.println("send message2");
        }
    }

MyProxy.java

public class MyProxy<T> implements InvocationHandler {

    T target;

    public T getProxy (T target) {
        this.target = target;
        return (T) java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("start exec proxy ---");
        Object result = method.invoke(target,args);
        System.out.println("end exec proxy ---");
        return result;
    }
}

Test.java

public static void main(String[] args) {
        MyProxy<Service> objectProxy = new MyProxy<>();
        Service proxy = objectProxy.getProxy(new ServiceImpl());
        proxy.sendmessage1();

        proxy.sendmessage2();
    }

console

start exec proxy ---
send message1
end exec proxy ---
start exec proxy ---
send message2
end exec proxy ---

实现方式二

public class Mytest {

    public static void main1(String[] args) {
        Service service = new Service() {
            @Override
            public void sendmessage1() {
                System.out.println("send message1");
            }

            @Override
            public void sendmessage2() {
                System.out.println("send message2");
            }
        };
        //注:service.getClass().getClassLoader() 和service.getClass().getInterfaces() 不可替换为 Service.class().getClassLoader() 和Service.class().getInterfaces() , 测试会报错
        Service o = (Service)java.lang.reflect.Proxy.newProxyInstance(service.getClass().getClassLoader(),
                service.getClass().getInterfaces(), (object, method, argus) -> {
                    System.out.println("start proxy");
                    Object invoke = method.invoke(service, args);
                    System.out.println("end proxy");
                    return invoke;
                });
        o.sendmessage1();
    }

}

interface Service {
    void sendmessage1 ();
    void sendmessage2 ();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值