大数据必学Java基础(八十八):通过案例和概念体会反射的好处
创始人
2024-04-02 21:36:25
0

文章目录

通过案例和概念体会反射的好处

一、通过案例体会反射的好处

二、通过概念再体会反射


通过案例和概念体会反射的好处

一、通过案例体会反射的好处

案例:美团外卖  -->  付款  -->  要么用微信支付,要么用支付宝支付

package com.lanson.test01;
//接口的制定方:美团外卖
public interface Mtwm {//在线支付功能:void payOnline();
}public class WeChat implements Mtwm{@Overridepublic void payOnline() {//具体实现微信支付的功能:System.out.println("我已经点了外卖,正在使用微信支付");}
}public class AliPay implements Mtwm {@Overridepublic void payOnline() {//具体的支付宝支付:System.out.println("我已经点了外卖,我正在使用支付宝进行支付");}
}public class BankCard implements Mtwm{@Overridepublic void payOnline() {System.out.println("我已经定了外卖,我正在用招商银行信用卡支付");}
}

测试类:

package com.lanson.test01;public class Test {public static void main(String[] args) {//定义一个字符串,用来模拟前台的支付方式:String str = "微信";if("微信".equals(str)){//str.equals("微信")---?避免空指针异常//微信支付://new WeChat().payOnline();pay(new WeChat());}if("支付宝".equals(str)){//支付宝支付://new AliPay().payOnline();pay(new AliPay());}if("招商银行".equals(str)){pay(new BankCard());}}//微信支付public static void pay(WeChat wc){wc.payOnline();}//支付宝支付public static void pay(AliPay ap){ap.payOnline();}//招商银行支付public static void pay(BankCard bc){bc.payOnline();}
}

为了提高代码的扩展性  -->  面向对象多态特性

package com.lanson.test01;public class Test {public static void main(String[] args) {//定义一个字符串,用来模拟前台的支付方式:String str = "微信";if("微信".equals(str)){//str.equals("微信")---?避免空指针异常//微信支付:pay(new WeChat());}if("支付宝".equals(str)){//支付宝支付:pay(new AliPay());}if("招商银行".equals(str)){pay(new BankCard());}}//方法形参是接口,具体传入的是接口的实现类的对象---》多态的一种形式public static void pay(Mtwm m){m.payOnline();}
}

多态确实可以提高代码的扩展性,但是扩展性没有达到最好。

怎么没有达到最好,上面的分支,还是需要手动的删除或者添加。

解决办法:反射机制

利用反射实现上述功能

package com.lanson.test01;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Demo {public static void main(String[] args) throws Exception {//定义一个字符串,用来模拟前台的支付方式:String str = "com.lanson.test01.AliPay";  //字符串:实际上:就是微信类的全限定路径//下面的代码就是利用反射:Class  cls = Class.forName(str);//cls-->Class类具体的对象--》AliPay字节码信息Object o = cls.newInstance();Method method = cls.getMethod("payOnline");method.invoke(o);}
}

二、通过概念再体会反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在编译后产生字节码文件的时候,类加载器子系统通过二进制字节流,负责从文件系统加载class文件。

在执行程序(java.exe)时候,将字节码文件读入JVM中这个过程叫做类的加载。然后在内存中对应创建一个java.lang.Class对象,这个对象会被放入字节码信息中,这个Class对象,就对应加载那个字节码信息,这个对象将被作为程序访问方法区中的这个类的各种数据的外部接口。

所以我们可以通过这个对象看到类的结构,这个对象就好像是一面镜子,透过镜子看到类的各种信息,我们形象的称之为反射。

这种“看透”class的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

说明:在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。

如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。

扩展知识:

动态语言vs静态语言

1、动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Object-C、 C#、JavaScript、 PHP、 Python、 Erlang 等

2、静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。

如Java、C、 C++等

所以Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制、字节码操作获得类似动态语言的特性。 Java的动态性让编程的时候更加灵活。

Class类的理解


  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

相关内容

热门资讯

国信证券:企业年金政策将合规执... 证券之星消息,国信证券(002736)12月29日在投资者关系平台上答复投资者关心的问题。 投资者提...
灵宝综治中心调解一起跨度近两年... 大象新闻记者 许继彬 通讯员 王建敏 李婕霄 校园安全无小事,少年成长总关情。孩子在校园内的意外磕碰...
著名经济学家魏杰:“十五五”时... 封面新闻记者 欧阳宏宇 “推动制度型开放,形成高质量的开放新格局,是“十五五”时期开放的重点。”12...
子洲县市场监管局举办法律法规专... 12月24日,子洲县市场监督管理局举办法律法规专题培训会,邀请子洲县人民法院法官王斐、钟鹏程作专题授...
董毅智律师:小红书沦为诈骗“温... 12月23日,丽江市古城区文化和旅游局采取一项公开举措,向小红书平台发出公函,指出其未能有效履行平台...
衡水办学神话破灭!原因“政策”... 衡水办学神话破灭!原因“政策”! 撰文|@渤海公子 最近有一张图,很有意思。 它没被大肆转发,却在很...
欣旺达子公司涉买卖合同纠纷 动... 中证报中证网讯(记者 齐金钊)日前,锂电池行业头部企业欣旺达全资子公司欣旺达动力科技股份有限公司,因...
欣旺达被吉利系公司起诉索赔23... 12月26日,欣旺达发布公告,其子公司欣旺达动力被吉利控股集团旗下的核心三电企业威睿电动提起诉讼。威...
北斗定位厘米级精准 哈尔滨工程... 中新网哈尔滨12月29日电 (董昕瑶)28日,来自哈尔滨工程大学18个学院的1200余名师生铲雪塑形...
马杜罗:美国威胁委内瑞拉人民是... 新华社加拉加斯12月28日电(记者田睿 刘宇辰)委内瑞拉总统马杜罗28日表示,美国威胁委内瑞拉人民是...