动态代理:
特点:字节码随用随创建,随用随加载
作用:不修改源码的基础上对方法增强
1.ProducerDao接口:
public interface ProducerDao {
//销售
public void saleProduce(float money);
//售后
public void afterService(float money);
}
2.Producer实现类
//生产者
public class Producer implements ProducerDao {
//销售
public void saleProduce(float money){
System.out.println("销售商品,并拿到钱"+money);
}
//售后
public void afterService(float money){
System.out.println("提供售后服务,并拿到钱"+money);
}
}
3.调用处理程序:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//获取方法执行的参数
Float money = (Float)args[0];
//判断当前方法是不是销售
if("saleProduce".equals(method.getName())){
result = method.invoke(target, money*0.8f);
}
return result;
}
}
4.测试类
public class Client {
public static void main(String[] args) {
//被代理对象
//被代理对象要是接口类型的
ProducerDao producer = new Producer();
//获取代理对象
//返回类型要是接口类型
ProducerDao proxy =(ProducerDao) Proxy.newProxyInstance(
producer.getClass().getClassLoader(),
producer.getClass().getInterfaces(),
new MyInvocationHandler(producer));
//使用代理对象调用被代理对象中的方法
proxy.saleProduce(10000f);
}
}