Java面试高频(五)

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

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

应用场景:

在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架,也是利用CGLIB 反射机制才得以实现。

例如:

1.JDBC的数据库连接:通过Class.forName()加载数据库的驱动程序 (通过反射加载)

2.Spring框架:Spring 通过 XML 配置模式装载 Bean

过程:将程序内所有 XML 或 Properties 配置文件加载入内存中,Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息,使用反射机制,根据这个字符串获得某个类的Class实例,动态配置实例属性。

2.反射的优缺点?

  • 优点: 运行期类型的判断,动态加载类,提高代码灵活度。

  • 缺点:

    1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。

    2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。

3.Java 中的动态代理是什么?有哪些应用?

当我们需要给某个类或者接口中的方法添加一些额外的功能比如日志、事务的时候,可以通过创建一个代理类来实现这些功能;该代理类既包含了原有类的完整功能,同时在这些功能的基础上添加了其他的逻辑。这个代理类不是事先定义好的,而是动态生成的,比较灵活;

应用场景:

1.AOP—面向切面编程,程序解耦

简言之当你想要对一些类的内部的一些方法,在执行前和执行后做一些共同的的操作,而在方法中执行个性化操作的时候--用动态代理。在业务量庞大的时候能够降低代码量,增强可维护性。

2.想要自定义第三放类库中的某些方法

我引用了一个第三方类库,但他的一些方法不满足我的需求,我想自己重写一下那几个方法,或在方法前后加一些特殊的操作--用动态代理。但需要注意的是,这些方法有局限性,我会在稍后说明。

4.怎么实现动态代理?

jdk动态代理(理解): 使用java反射包中的类和接口实现动态代理的功能。反射包 java.lang.reflect , 里面有三个类 : InvocationHandler , Method, Proxy.

cglib动态代理(了解): cglib是第三方的工具库, 创建代理对象。cglib的原理是继承, cglib通过继承目标类,创建它的子类,在子类中重写父类中同名的方法, 实现功能的修改。因为cglib是继承,重写方法,所以要求目标类不能是final的, 方法也不能是final的。cglib的要求目标类比较宽松, 只要能继承就可以了。cglib在很多的框架中使用,比如 mybatis ,spring框架中都有使用。

5.static 关键字的作用?

static关键字主要有两种作用:

第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。

第二,实现某个方法或属性与类而不是对象关联在一起。

具体而言,在Java语言中,static主要有4中使用情况:成员变量、成员方法、代码块和内部类。

6.super 关键字的作用?

1.super关键字可以在子类的构造方法中显示地调用父类的构造方法,super()必须为子类构造函数中的第一行。

2.super可以用来访问父类的成员方法或变量,当子类成员变量或方法与父类有相同的名字时也会覆盖父类的成员变量或方法,这个时候要想访问父类的成员变量或方法只能通过super关键字来访问,子类方法中的super.方法名()不需要位于第一行。

参考文档

JDK动态代理(介绍理解,如何实现)_TxCode的博客-CSDN博客_jdk动态代理

浅谈Java中static关键字的作用 - html中文网

点赞
  1. 水军2号说道:
    Google Chrome Windows Vista
    我来学习了,大佬 :hehe:

发表回复

电子邮件地址不会被公开。必填项已用 * 标注