发表于: 2022-05-12 19:26:23
1 534
今天学习了任务一中师兄们的深度思考小课堂
什么叫反射?反射的坏处是什么?有哪些反射的应用场景?:
反射的应用场合
在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定
Person p=new Student();
其中编译时类型为Person,运行时类型为Student。 除此之外,程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为Object,但是程序有需要调用该对象的运行时类型的方法。 为了解决这些问题,程序需要在运行时发现对象和类的真实信息。 然而,如果编译时根本无法预知该对象和类属于哪些类, 程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。
静态编译和动态编译
静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了。你写小程序没问题, 但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力
动态编译就不一样了,你编译的时候那些模块都没有编译进去,一般情况下你可以把那些模块都编译成dll,这样你启动程序(初始化)的时候这些模块不会被加载,而是在运行的时候,用到那个模块就调用哪个模块。
静态编译和动态编译的区别
简单的打个比方,我写个阅读器,支持txt,pdf,udm三种格式,暂时把读txt,读pdf,读udm定义为三个功能模块。 使用静态编译:我想看个txt,点击应用程序图标以后三个功能都加载进来了,判断格式,使用读txt模块。(在这里,另外两个模块的作用就是占用系统资源) 使用动态编译:我想看个txt,点击应用程序,判断格式,只加载读txt模块,使用读txt模块。
还有spring框架是事先就写好的框架,他内部的处理并不知道用户要写哪些类,因为那是以后由用他的人来定的,这时候你还能在spring内部去new吗?所以用户在用的时候才去配置文件中配置类路径
反射的好处
java的反射机制就是增加了程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码,并重新编译。 使用反射:
class.forName("person").newInstance(); 而且这个类描述可以写到配置文件中,如 **.xml, 这样如果想实例化其他类,只要修改配置文件的"类描述"就可以了,不需要重新修改代码并编译。
常见的问题
反射的坏处之一便是内部暴露:当我们使用反射时,其实是在动态的获取信息,那么对于被获取信息的一方来说,其实是不安全的,内部的所有东西在反射面前都无处遁形,非常的不安全,相当于我们在别人面前没有秘密可言。
解决方案
所以一般来说,对于反射,我们常用的方式是一般能不用就不用,用的话也是用在框架上面,底层已经给我们写好了,我们直接填写全类名调用即可,非常的方便。
为什么要使用Interface,而不是直接使用一个实体类来完成任务?
接口(英文:Interface)
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口的特性:
1.接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
2. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
实现类
实现类是针对接口来讲的,是实现接口中约定的内容,意思是说,接口中定义规范,实现类来确定规范如何运行的。
接口与类相似点
1.一个接口可以有多个方法
2.接口文件保存在 .java 结尾的文件中,文件名使用接口名
3.接口的字节码文件保存在 .class 结尾的文件中
4.接口相应的字节码文件必须在与包名称相匹配的目录结构中
接口与类的区别
1.接口不能用于实例化对象
2.接口没有构造方法
3.接口中所有的方法必须是抽象方法
4.接口不能包含成员变量,除了 static 和 final 变量
5.接口不是被类继承了,而是要被类实现
6.接口支持多继承
遇到问题:没有
明天计划:总结完任务一。
评论