一篇文章搞定java反射,回调,事件委托附实践代码

反射

1.什么是反射?

官方:主要指应用程序访问、检测、修改自身状态与行为的能力。JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法
个人理解:java 反射机制知道类的结构,能够在程序运行过程中,动态地根据.class文件获取类信息的一种手段,包括类属性,方法,修饰符,接口等信息。

2. 为什么使用反射?

动态开放性质,运行时装配代码,灵活。
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。

3. 优缺点和使用场景

优点:
能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
功能强大
缺点:
性能低
安全限制
程序健壮性,破坏类的封装性


回调

1.是什么?

官方解释:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
个人理解:
这个被传入的、后又被调用的函数就称为回调函数。

简单来讲就是A类调用了B类的方法,然后再B类的方法中返回来又调用了A的方法。

2.有什么优势,场景

灵活,易于扩展。

3.回调与接口,抽象类
public class Main implements InterfaceExample{
   

    public static void main(String[] args) {
   
        System.out.println("------接口使用测试--------");
        InterfaceTest test = new InterfaceTest();
        //调用InterfaceTest的handleThings方法,并传递Main的实例
        test.handleThings(new Main());
        System.out.println("------异步回调测试--------");
    }

    @Override   //重写接口方法
    public void sendMessage(String string) {
   
        System.out.println("接口回调成功,利用 " + string + " 做一些事");
    }

}

//接口也可以写在一个独立的.java文件里
interface InterfaceExample {
   
    void sendMessage(String string);
}
public class InterfaceTest {
   

    //注意这里Main实例向上转型,接口变量引用了Main实例
    public void handleThings(InterfaceExample example) {
   

        new Thread(new Runnable() {
   
            @Override
            public void run() {
   
                System.out.println("-----做一些事------");
                try {
   
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
                //回调接口方法
                example.sendMessage("接口传的参数");
            }
        }).start();

    }
}

委托

1.是什么?

委托是一个类型(定义了方法的类型),代表着具有相同参数列表和返回类型的方法的类型,一个委托变量可以搭载多个方法,并且可以使得委托对象所搭载的方法并不属于同一个类,当调用此变量时,可以依次调用所绑定的方法。

委托是一种引用类型,作为引用,指向特定的方法,可以用于将方法作为参数传递给其他方法。

  • 委托类似于 C++ 函数指针
  • 委托允许将方法作为参数进行传递
  • 托可用于定义回调方法。
  • 一个委托可以绑定多个方法
2.由来?

为什么需要委托呢?为了使代码解耦,更具有扩展性,更灵活,具体体现在哪里呢?

举例
在观察者模式中,主题对象和观察者紧密耦合。类图如下:
在这里插入图片描述

代码:
抽象观察者

public abstract class Observer {
   
    public abstract void update();
}

抽象主题对象
需要知道具体观察者,并且在自己改变时通知观察者对象,让观察者执行update操作。

public class Subject {
   
    List
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗琪小姐姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值