动态代理的作用:在不改变源码的情况下增强方法;
举个例子,在进行简单的jdbc操作的时候,你想做到每执行一次sql语句就打印一句话,作为日志.
说明:本例子是基于子类(任何一个java普通类)的动态代理,(当然也有基于接口的动态代理模式了)[点击这里连接到](https://blog.csdn.net/weixin_45127611/article/details/104523192);
首先定义简单类,定义一个简单的功能吧:
public class Producter{
@Override
public Float saleProduct(Float money) {
System.out.println("卖了"+money);
return money;
}
}
好,类出来了,现在给你出个问题,你怎么能够在不改变源码的情况下,让每次执行这个方法之前打印一行字,或者是改变money参数的倍数等简单操作??
这些问题用JDK官方提供的 Proxy 类,就没有办法解决了,因为这个java类没有实现任何的接口,只是一个java的简单类;但是这也是有办法增强的,不过要用到三方jar包(cglib和asm)少一不可
接下来是类代码:
public class TestCglib {
//要代理的对象
private static IProduct target = new ProductImpl();
public TestCglib(IProduct target){
this.target = target;
}
public IProduct getlLoggingProxy(){
IProduct proxy = null;
//代理对象由哪一个类加载器负责加载
Class loader = target.getClass();
//代理对象的类型,即其中有哪些方法
MethodInterceptor met = new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
Object returnValue = null;
if("saleProduct".equals(arg1.getName())) {
Float money = (float) (0.8*(Float)arg2[0]);
returnValue = arg1.invoke(target, money);
}
return returnValue;
}
};
return proxy = (IProduct)Enhancer.create(loader,met);
}
public static void main(String[] args) {
TestCglib tc = new TestCglib(new ProductImpl());
IProduct pr = tc.getlLoggingProxy();
pr.saleProduct(1000f);
/*
IProduct proxy = (IProduct)Enhancer.create(target.getClass(),
new MethodInterceptor() {
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
Object returnValue = null;
if("saleProduct".equals(arg1.getName())) {
Float money = (float) (0.8*(Float)arg2[0]);
returnValue = arg1.invoke(target, money);
}
return returnValue;
}
});
proxy.saleProduct(1000f);
*/
}
}
两种方法运行的结果都是:
卖了800.0
写到最后:用这种方式的(基于子类的动态代理)中,无需被代理类有什么特殊的要求只需要是一个java的简单类就行了,然后用到了这个类的生命;
还有一种基于接口的动态代理:jdk自带的动态代理
https://blog.csdn.net/weixin_45127611/article/details/104523192
文章浏览阅读87次。java计算机毕业设计后勤管理系统源码+mysql数据库+系统+lw文档+部署。springboot基于精细化考核的离散数学课程教学目标达成系统。JSP企业客户服务与产品管理系统的设计和实现SQLServer。springboot基于Springboot的测试项目管理平台。springcloud基于微服务架构的乐居租房网的设计与实现。springboot垂钓分享交流网的设计与实现。ssm基于SSM框架的在线健康系统设计与实现。ssm基于SSM框架的毕业生离校管理系统。
文章浏览阅读1.8k次。而平行于转子磁轴方向的电流分量,所产生的磁场与转子磁场一致,就不会产生任何的力矩。另外,一个好的控制算法就需要使这个平行于转子磁轴方向的电流分量尽量最小化,因为,这个电流分量只会使电机产生多余的热量,并加剧轴承的磨损。由此而得到的电机力矩和这个电流分量的大小成比例。又因为磁场的大小与方向与电流的大小与方向有着直接的关系,所以在用FOC控制算法控制BLDC时的关键就是控制三相输入的电流大小与方向。而控制电流产生定子磁场与转子磁场垂直的关键在:控制稳定的三相输入电压及其电流向量,并且我们得知道转子的实时位置。_verilog 电机foc控制
文章浏览阅读6.2k次,点赞4次,收藏5次。MyBatis新增数据时自增id的两种写法_mybatis id自增
文章浏览阅读2.7k次,点赞4次,收藏4次。编译原理之消除算术表达式文法的左递归_编译原理算数表达式怎么消除左递归
文章浏览阅读4.4k次,点赞3次,收藏33次。1 基本原理LFM(Latent Factor Model)隐语义模型是最近几年推荐系统领域最为热门的研究话题,它的核心思想是通过隐含特征(Latent Factor)联系用户兴趣和物品。那这种模型跟ItemCF或UserCF有什么不同呢?这里可以做一个对比:对于UserCF,我们可以先计算和目标用户兴趣相似的用户,之后再根据计算出来的用户喜欢的物品给目标用户推荐物品。 而ItemCF,..._基于隐语义模型的协同过滤
文章浏览阅读395次。https://www.w3cschool.cn/weixinapp/weixinapp-download.html
文章浏览阅读340次,点赞9次,收藏9次。iOS Boilerplate: 快速启动你的iOS应用开发iOS Boilerplate 是一个用于快速创建iOS应用的模板项目。它包含了各种常见的功能和最佳实践,能够帮助开发者节省时间,并确保代码质量。项目简介iOS Boilerplate 旨在为新项目的开始提供一个稳定、可扩展的基础。该项目基于 Swift 5.0 和 Xcode 12 开发,遵循 MVVM 设计模式,并集成了多个常用...
文章浏览阅读1k次,点赞23次,收藏18次。PHP运算符汇总_php中输出运算符
文章浏览阅读835次。本方案以组态王和2台三菱FX5u PLC为例,介绍组态王与多台 PLC的无线以太网通信实现过程。_fx5-enet/ip tcp 通讯
文章浏览阅读1.8k次。之后就能正常执行了。ln -s /usr/local/python/bin/python3 /usr/bin/python重新配置软连接原因是配置python3的环境时,中途又编译安装了python3,导致前面设置的软连接失效不知为何,python3的软连接没有生效于是打开python,发现python运行的版本是python2.7.5改成/usr/bin/python 也不行开始以为是/usr/..._python软连接失效
文章浏览阅读2.6k次。ssh 远程shell脚本I want to run my commands securely. Is there any way for this? Yes, there are a lot of options. But the most simple and secure way is running scripts or commands over ssh.我想安全地运行命令。 有什么办..._ssh remote shell
文章浏览阅读5.8k次,点赞4次,收藏3次。Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' delete from t_book where boo_cause: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception: you have a