乐趣区

关于java:转经典Java面试题的答案反射

​大家好,我是酱油君。这是互联网技术岗的分享专题,废话少说,进入正题:

57. 什么是反射?

反射次要是指程序能够拜访、检测和批改它自身状态或行为的一种能力

Java 反射:在 Java 运行时环境中,对于任意一个类,是否晓得这个类有哪些属性和办法?对于任意一个对象,是否调用它的任意一个办法

Java 反射机制次要提供了以下性能:

  • 在运行时判断任意一个对象所属的类。
  • 在运行时结构任意一个类的对象。
  • 在运行时判断任意一个类所具备的成员变量和办法。
  • 在运行时调用任意一个对象的办法。

Java Reflection API 简介

在 JDK 中,次要由以下类来实现 Java 反射机制,这些类(除了第一个)都位于 java.lang.reflect 包中

  • Class 类:代表一个类,位于 java.lang 包下。
  • Field 类:代表类的成员变量(成员变量也称为类的属性)。
  • Method 类:代表类的办法。
  • Constructor 类:代表类的构造方法。
  • Array 类:提供了动态创建数组,以及拜访数组的元素的静态方法。

58. 什么是 java 序列化?什么状况下须要序列化?

序列化:将对象写入到 IO 流中。

意义:序列化机制容许将实现序列化的 Java 对象转换位字节序列,这些字节序列能够保留在磁盘上,或通过网络传输,以达到当前复原成原来的对象。序列化机制使得对象能够脱离程序的运行而独立存在。

什么状况下须要序列化:

  • 所有可在网络上传输的对象都必须是可序列化的,比方 RMI(remote method invoke, 即近程办法调用),传入的参数或返回的对象都是可序列化的,否则会出错;
  • 所有须要保留到磁盘的 java 对象都必须是可序列化的

如何序列化:

如果须要将某个对象保留到磁盘上或者通过网络传输,那么这个类应该实现 Serializable 接口或者 Externalizable 接口之一。

59. 动静代理是什么?有哪些利用?

酱油君批:59 和 60 题倡议先理解代理的设计模式~ 同时本人动手做 Demo,面试中咱们常常会深入实际问。

动静代理:当想要给实现了某个接口的类中的办法,加一些额定的解决。比如说加日志,加事务等。能够给这个类创立一个代理,故名思议就是创立一个新的类,这个类不仅蕴含原来类办法的性能,而且还在原来的根底上增加了额定解决的新类。这个代理类并不是定义好的,是动静生成的。具备解耦意义,灵便,扩展性强。

动静代理的利用:Spring AOP、Hibernate 数据查问、测试框架的后端 mock、RPC 近程调用、Java 注解对象获取、日志、用户鉴权、全局性异样解决、性能监控,甚至事务处理等。

60. 怎么实现动静代理?

Java 中两种常见的动静代理形式:JDK 原生动静代理和 CGLIB 动静代理。

通过实现接口的形式 -> JDK 动静代理。

通过继承类的形式 -> CGLIB 动静代理。

JDK 动静代理:

JDK 动静代理次要波及两个类:java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler

JDK 动静代理的实现:

  • 通过实现 InvocationHandlet 接口创立本人的调用处理器;
  • 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创立动静代理;
  • 通过反射机制获取动静代理类的构造函数,其惟一参数类型就是调用处理器接口类型;
  • 通过构造函数创立动静代理类实例,结构时调用处理器对象作为参数参入。

CGLIB 动静代理:

CGLib 采纳底层的字节码技术,全称是:Code Generation Library,CGLib 能够为一个类创立一个子类,在子类中采纳办法拦挡的技术拦挡所有父类办法的调用并趁势织入横切逻辑。

两者性能比照:

1、CGLib 所创立的动静代理对象在理论运行时候的性能要比 JDK 动静代理高不少,有钻研表明,大略要高 10 倍;

2、然而 CGLib 在创建对象的时候所破费的工夫却比 JDK 动静代理要多很多,有钻研表明,大略有 8 倍的差距;

3、因而,对于 singleton 的代理对象或者具备实例池的代理,因为无需频繁的创立代理对象,所以比拟适宜采纳 CGLib 动静代理,反之,则比拟实用 JDK 动静代理。

文章转载自:
经典 Java 面试题的答案——反射

退出移动版