文章目录
反射
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<Observer> obse