理解Java方法增强
在实际开发中,我们往往需要对某些方法进行增强,常用的方法增强的方式有三种。
类继承 、方法覆盖
必须控制对象创建,才能使用该方式装饰者模式方法加强
必须和目标对象实现相同接口或继续相同父类,特殊构造器(传入被包装对象)动态代理
我们来编写一个案例感受一下,新建一个Java项目。
新建类Cat
public class Cat{
public void run(){
System.out.println("喵喵~一只猫在奔跑");
}
}
现在若想对该类的run()方法进行增强,第一种方法,利用类继承,方法覆盖。
编写测试代码
@Test
public void demo1(){
//方法增强的第一种途径,利用类的继承以及方法覆盖
Cat cat = new Cat(){//匿名内部类
@Override
public void run() {
//保持方法原有的功能
super.run();
//新增该方法功能
System.out.println("抓到一只老鼠");
}
};
cat.run();
}
运行测试代码
方法成功被增强了。
该种增强方法的方式必须控制对象的创建。
那么第二种增强方式就是装饰者模式,但是请注意,使用该方式增强方法是有前提的,就是必须与原对象去实现相同的接口或者继承相同的类。
演示一下。
新建一个接口ICat
interface ICat{
public void run();
}
然后新建一个装饰者CatFilter
//装饰者
class CatFilter implements ICat{
private ICat cat;//cat就是被包装的对象
//实现目标对象相同的接口
//特殊的构造方法
public CatFilter(ICat cat){
this.cat = cat;
}
public void run() {
//原有方法功能
cat.run();
//新增方法功能
System.out.println("又抓住一只老鼠");
}
}
编写测试代码
@Test
public void demo2(){
//第二种 装饰者模式 前提:必须与原对象去实现相同的接口或者继承相同的类
ICat cat = new CatFilter(new Cat());
cat.run();
}
方法被成功增强。
第三种增强方式就是动态代理,也是Java中进行方法增强最常用的方式。
原理:根据原对象在内存中构造一个代理对象,而原对象的所有方法都将去执行代理对象的invoke方法。
演示一下。
编写测试代码
@Test
public void demo3(){
final ICat cat = new Cat();//原对象
ICat catProxy = (ICat) Proxy.newProxyInstance(cat.getClass().getClassLoader(), cat.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] objs)
throws Throwable {
//增强run方法
if(method.getName().equals("run")){
method.invoke(cat,objs);//调用原对象的方法,保留原方法的功能
//新增功能
System.out.println("抓住第三只老鼠");
}
return null;
}
});
catProxy.run();
}
运行测试代码
方法被成功增强。
以上便是Java方法增强的三种方式。
理解Java方法增强的更多相关文章
- 深入理解 Java 方法
方法(有的人喜欢叫函数)是一段可重用的代码段.
- Java中增强一个类的几种方法
今天有人问我怎么增强一个类的功能.博客刚好没东西,今天就讲讲增强类. 增强的手段有三种类型: 1.继承或者实现接口:特点是被增强对象不能变,增强的内容不能变. 2.装饰着模式:特点是被增强对象可变,但 ...
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- 理解JAVA - 面向对象(object) - 属性,方法
理解JAVA - 面向对象(object) - 属性,方法 多态的体现: 向上造型,父类接收子类对象:向上造型: 从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- java方法的多态性理解
1.什么是java的多态 浏览了别人博客中的一些介绍多态的文章,发现大家的描述有点不一样,主要区别在于是否把方法的重写算做多态.一种我比较认同的说法如下: 多态分为两种 a. 编译时多态:方法的重载: ...
- java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
- 深入理解java中main方法
理解main方法语法 深入理解main方法: 解释main方法的形式:public static void main(String[] args){} main方法调用者:虚拟机 java虚拟机需要调 ...
- 深入理解java虚拟机(十一) 方法调用-解析调用与分派调用
方法调用过程是指确定被调用方法的版本(即调用哪一个方法),并不包括方法执行过程.我们知道,Class 文件的编译过程中并不包括传统编译中的连接步骤,一切方法调用在 Class 文件调用里面存储的都只是 ...
随机推荐
- HBase安装学习
一.下载安装 $ wget http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.7.0.tar.gz $ tar -zxvf hbase-1 ...
- [20190523]修改参数后一些细节注意2.txt
[20190523]修改参数后一些细节注意2.txt --//上午想模拟链接遇到的情况,链接http://blog.itpub.net/267265/viewspace-2645262/--//就是修 ...
- fiddler---Fiddler工具栏功能介绍
前几篇简单的介绍了Fiddler的功能,对于工具栏的操作只是简单了解,今天写一篇工具栏功能介绍和操作. 工具栏功能介绍 工具栏内容 工具栏依次是:会话保存,数据重放(Replay),转到(GO),数据 ...
- driver.find_element_by_xpath() 带参数时的写法
假设要定位如下所示的 Elements,且文本 “1234567890” 对应参数 cluster_name: <td class="xxxx-body">12345 ...
- 5.Java基础_Java算术/字符/字符串/赋值运算符
/* 算术/字符/字符串/赋值 运算符 */ public class OperatorDemo01 { public static void main(String[] args){ //算术运算符 ...
- Html学习之十二(CSS选择器的应用二)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 关联规则 -- apriori 和 FPgrowth 的基本概念及基于python的算法实现
apriori 使用Apriori算法进行关联分析 貌似网上给的代码是这个大牛写的 关联规则挖掘及Apriori实现购物推荐 老师 Apriori 的python算法实现 python实现关联规则 ...
- Spring Boot 自定义Intercepter
在 SpringBoot2.X 中 ,WebMvcConfigurerAdapter 被deprecated , 更好的做法是 implements WebMvcConfigurer 一.自定义拦截器 ...
- redis数据查看工具
Redis缓存数据库目前已大量的应用,广泛用于存储session信息,权限信息,交易作业等热数据.但是Redis存在的数据可视化不便.Redis的数据查看维护困难.Redis状态监控运维不易等问题.使 ...
- C# Windows服务创建安装卸载
一.创建Windows服务 使用VS创建一个新的windows服务应用程序 创建完成之后 二.相关配置 修改Service1名称为StartService(可以不改,自行选择) 添加安装程序并修改配置 ...