(Java每日一谈:第十日——就业面试知识通关策略)Java基础——Java中的泛型与反射

        Java泛型是如何工作的?不做解释

        Java中的反射是什么意思?有哪些应用场景?

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

每一个类都有一个Class对象,包含了与类相关的信息。当编译一个新类时,会产生一个同名的.class文件,该文件内容保存着Class对象。类加载时相当于Class对象的加载,类在第一次使用时才会动态加载到JVM中。也可以使用Class.forName("com.mysql.jdbc.Driver")这种方式来控制类的加载,该方法会返回一个Class对象。

反射可以提供运行时的类信息,并且这个类可以在类加载的时候才加载进来,甚至在编译的时期该类的.class文件不存在也可以加载进来。Class和java.lang.reflect一起对反射提供了支持,java.lang.reflect库类主要包括以下三个类:

Field:可以使用get()和set()方法读取和修改Field对象关联的方法

Method:可以使用invoke()方法调用与Method()对象关联的方法

constructor:可以用constructor创建新的对象

        反射优缺点?

优点:运行期类型的判断,class.forName()动态加载类,提高代码的灵活性;

缺点:

尽管反射非常强大,但也不能滥用,如果一个功能可以不用反射完成,那么最好不用,使用反射技术的几条警示:

        1、性能开销:反射涉及了动态类型的解析,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比非反射操作的效率低很多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。

        2、安全限制:使用反射技术要求程序必须在一个没有安全限制的环境中运行

        3、内部暴露:由于反射允许代码执行一些在正常情况下不被允许的操作(比如:访问私有属性和方法),所以使用反射可能会导致一些意料之外的副作用,这可能会导致代码功能失调,并破坏可移植性。反射代码破坏了抽象性,因此当平台发送改变的时候,代码的行为就有可能随之变化。

        反射中,Class.forName和ClassLoader的区别?

Java中class.forName()和ClassLoader都可用来对类进行加载

class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。

而classloader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块.

Class.forName(name,initialize,loader)带参函数也可控制是否加载static块。并且只有调用了newInstance()方法采用调用构造函数,创建类的对象。

        Java获取反射的三种方法?

1、通过new对象实现反射机制

2、通过路径实现反射机制

3、通过类名实现反射机制

猜你喜欢

转载自blog.csdn.net/weixin_50249953/article/details/124105431
今日推荐