Java的JDK动态代理

在Java开发中如果一个类中的方法在基本功能之外需要进行功能扩充或者功能增强,如:事务控制、权限判断、日志记录等等操作,此时可以使用动态代理机制。


代理协助本体进行功能的增强

动态代理不需要修改源代码基础上对原有类的功能进行增强

代码示例:

1、创建接口,定义接口的规范

package com.wen.service;

/**
 * 接口
 */
public interface Actor {
    void sing(int money);
    
    String dance(int money);
    
    void rap(int money);
}

2、定义实现接口的子类,实现接口定义的方法,此方法只需要把核心功能实现即可,其他增强的操作可以在代理类中实现。

package com.wen.service.impl;

import com.wen.service.Actor;

public class ActorImpl implements Actor {

    @Override
    public void sing(int money) {
        System.out.println("唱歌...."+money);
    }

    @Override
    public String dance(int money) {
        System.out.println("跳舞...."+money);
        return "发放签名";
    }

    @Override
    public void rap(int money) {
        System.out.println("rap...."+money);
    }
}

3、 定义代理类,在代理类中对被代理对象进行方法增强。

package com.wen.advice;

import com.wen.service.Actor;
import com.wen.service.impl.ActorImpl;

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

public class JJGS {
    public static void main(String[] args) {
        //1.创建被代理类的对象------具体的人物actor
        Actor actor=new ActorImpl();

        //2.创建代理对象----具体某个人为上面actor服务
        /**
         *ClassLoader loader:类的加载器----联系方式
         * Class<?>[] interfaces:类的接口类型----被代理人的类型
         * InvocationHandler h:处理器----我要帮你干什么
         */
        Actor jjr= (Actor) Proxy.newProxyInstance(ActorImpl.class.getClassLoader(), ActorImpl.class.getInterfaces(), new InvocationHandler() {
            /**
             * Object proxy:被代理对象的引用,系统会自动创建被代理对象的一个映射
             * Method method:被代理对象的方法
             * Object[] args:被代理对象方法的参数
             * 返回值是  被代理对象执行后的返回值
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("演出前的增强:联系业务");
                System.out.println("演出前的增强:互联网造势");
                System.out.println("演出前的增强:演出前的宣传");
                //被代理对象方法的执行 ,并获得返回值
                Object result=null;
                result = method.invoke(actor, args);
                System.out.println("演出后的增强:结算费用并纳税");
                return result;
            }
        });
        //执行功能
        //jjr.dance();
        jjr.sing(900);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值