理解Java方法增强

简介: 理解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方法增强的三种方式。

目录
相关文章
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
67 4
|
29天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
23天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
63 2
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
49 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
30天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
1月前
|
Java 大数据 API
别死脑筋,赶紧学起来!Java之Steam() API 常用方法使用,让开发简单起来!
分享Java Stream API的常用方法,让开发更简单。涵盖filter、map、sorted等操作,提高代码效率与可读性。关注公众号,了解更多技术内容。
|
30天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
30天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
30天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
34 1
|
30天前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
28 1
下一篇
无影云桌面