在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);
}
}