一、案例:支付功能---> 微信、支付宝、云闪付等等
提供一个支付接口
package com.lmh;
/**提供支付接口
* @author codelmh
* @data 2021/11/24
*/
public interface Payment {
void payOnline();
}
微信支付实现 支付接口
package com.lmh;
/** 微信实现支付接口
* @author codelmh
* @data 2021/11/24
*/
public class weChat implements Payment{
@Override
public void payOnline() {
System.out.println("using wechat pay");
}
}
支付宝实现 支付接口
package com.lmh;
/** 支付宝实现支付接口
* @author codelmh
* @data 2021/11/24
*/
public class AliPay implements Payment{
@Override
public void payOnline() {
System.out.println("using AliPay to pay...");
}
}
实现模拟前端支付功能
package com.lmh;
/**
* @author codelmh
* @data 2021/11/24
*/
public class TestPayment {
public static void main(String[] args) {
//模拟前端提交支付方式
String str = "微信";
if ( "微信".equals(str)) {
pay(new weChat());
}
if ("支付宝".equals(str)) {
pay(new AliPay());
}
}
public static void pay(weChat weChat){
weChat.payOnline();
};
public static void pay(AliPay aliPay){
aliPay.payOnline();
}
}
假设我们再增加 云闪付、各种银行卡支付,每一个支付方式都需要在我们TestPayment里多加一个方法 ,100个就要写100个pay方法。扩展性不高
所以我们有一个解决方式:多态, 这样就能使用一个方法调用多个实现类
package com.lmh;
/**
* @author codelmh
* @data 2021/11/24
*/
public class TestPayment {
public static void main(String[] args) {
//模拟前端提交支付方式
String str = "微信";
if ("微信".equals(str)) {
pay(new weChat());
}
if ("支付宝".equals(str)) {
pay(new AliPay());
}
}
//使用多态
public static void pay(Payment payment) {
payment.payOnline();
}
}
这样代码的扩展性确实提高了很多,但是还没有达到最好。 上面的分支,还是需要我们手动添加或者删除,所以我们就有了反射机制。
package com.lmh;
import java.lang.reflect.Method;
/**
* @author codelmh
* @data 2021/11/24
*/
public class RefelctPayment {
public static void main(String[] args) throws Exception {
//模拟 前端传值
String str = "com.lmh.AliPay";
// 使用 class.forName(类全限定名) 获取对象
Class<?> clazz = Class.forName(str);
// 对象实例化
Object o = clazz.newInstance();
// 获取对象的 payOnline 方法
Method pay = clazz.getMethod("payOnline");
// 调用对象的 方法 method
pay.invoke(o);
}
}
可以发现短短的4行代码就将代码的扩展性非常之高,这就是反射
二、什么是反射
Java 的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为 Java 语言的反射机制。反射被视为动态语言的关键。
三、反射的应用场景
通过上面的案例大家都应该明白反射一般使用在代码通用性较高的地方或者是框架的编写。
四、反射的概念
java中他为什么叫反射呢?(自己的理解)
java中有封装的特性 所以将封装类 比喻成一个没有任何出口的房间,那我们如果要从这个房间里取东西,是拿不到的。java反射机制就是在这个房间按了个门,然后将这个房间里的所有东西都能拿到了。
问题:会不会破坏java的封装性:
首先,封装,是将具体的实现细节隐藏,而把功能作为整体提供给类的外部使用,也就是说,公有方法能够完成类所具有的功能。当别人使用这个类时,如果通过反射直接调用私有方法,可能根本实现不了类的功能,甚至可能会出错,因此通过反射调用私有方法可以说是没有任何用处的,开发人员没有必要故意去破坏封装好的类。从这点上看,封装性并没有被破坏。(摘自百度问答)