反射

1. 什么是反射?

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

2、说说反射创建实例的几种方式?

方式一:类名.class 得到这个类的字节码对象 不对类中的内容进行初始化操作
方式二:对象名 .getclass 得到类的字节码对象 对这个类的静态、非静态、构造方法进行初始化的操作。
方式三:class.forname 得到这个类的字节码对象 但是会对这个类的静态模块进行初始化的加载

3、如何通过反射调用对象的方法?

(1)、 得到该对象所对应的Class对象
(2)、 通过该Class对象得到该类的构造方法所对应的Constructor对象
(3)、通过该Constructor对象的newInstance方法得到该类的一个实例(对象)
(4)、通过该Class对象得到该方法所对应的Method对象
(5)、通过该Method对象的invoke方法进行调用

4. 什么是 Java 序列化?什么情况下需要序列化?

Java 序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。
以下情况需要使用 Java 序列化:
· 想把的内存中的对象状态保存到一个文件中或者数据库中时候;
· 想用套接字在网络上传送对象的时候;
· 想通过RMI(远程方法调用)传输对象的时候。

5. 动态代理是什么?有哪些应用?

动态代理是运行时动态生成代理类。
动态代理的应用有 spring aop、hibernate数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。

6. 怎么实现动态代理?

JDK 原生动态代理和 cglib 动态代理。JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
③代理模式:Spring AOP就是使用的动态代理。
代理模式:
一)静态代理
实现方式:
a) 为真实类和代理类提供的公共接口或抽象类。(租房)
b) 真实类,具体实现逻辑,实现或继承a。(房主向外租房)
c) 代理类,实现或继承a,有对b的引用,调用真实类的具体实现。(中介)
d) 客户端,调用代理类实现对真实类的调用。(租客租房)

动态代理
(1)、jdk动态代理使用的局限性:
通过反射类Proxy和InvocationHandler回调接口实现的jdk动态代理,要求委托类必须实 现一个接口,但事实上并不是所有类都有接口,对于没有实现接口的类,便无法使用该方 方式实现动态代理。
(2)、cglib动态代理(没有接口实现)

实现方式:
a) 公共的接口(必须是接口,因为Proxy类的newproxyinstance方法的第二参数必须是个接口类型的Class)
b) 多个真实类,具体实现的业务逻辑。
c) 代理类,实现InvocationHandler接口,提供Object成员变量,和Set方法,便于客户端切换。
d) 客户端,获得代理类的实例,为object实例赋值,调用Proxy.newproxyinstance方法在程序运行时生成继承公共接口的实例,调用相应方法,此时方法的执行由代理类实现的Invoke方法接管。

对象拷贝

1. 为什么要使用克隆?

克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。

2. 如何实现对象克隆?

· 实现 Cloneable 接口并重写Object 类中的 clone() 方法。
· 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

3. 深拷贝和浅拷贝区别是什么?

· 浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
· 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。

异常

1、 throw 和 throws 的区别?

throw:是真实抛出一个异常。
throws:是声明可能会抛出一个异常。

2、final、finally、finalize 有什么区别?

final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。
finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果 finally 部分存在,则一定会执行 finally 里面的代码。
finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。

3、 try-catch-finally 中哪个部分可以省略?

try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally。

4、try-catch-finally 中,如果 catch 中 return 了,finally还会执行吗?

finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。

5、常见的异常类有哪些?

NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
NumberFormatException 字符串转换为数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
IOException IO 异常
SocketException Socket 异常

6、异常处理的方式

  1. Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。<br /> 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。<br /> 捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。

7、项目中是否运用到全局异常?

Java 把异常当做对象来处理。Throwable是所有错误或异常的超类。Throwable 类有两个直接子类:Error 类和 Exception 类。
一般项目中都会有一些业务相关(非 JVM 抛出)的异常,可以使用自定义异常继承相关的异常来抛出有用的异常信息,根据异常示信息进行程序修改。比如空指针异常 NullPointException,可以抛出 message 为 “xxx 为空”,例如在进行相关的业务处理时是会进行自定义异常的处理告诉用户相关的异常信息 定位异常位置,而不用输出堆栈信息。
自定义异常通常是定义一个继承自 Exception 类的子类,一般会直接继承自 Exception 类,而不会继承某个运行时的异常类。
对于全局异常,我们项目中使用@ControllerAdvice+@ExceptionHandler来捕获全局的异常,我们根据抛出来的不同的自定义异常做不同的处理.有些异常为了方便查询检索,存储到数据库中,有些异常会通过日志文件的方式存储。
(如果这么回答的话,就要考虑你们的日志是按什么方式存储,怎么切分的。比如使用logback按天来进行切割)
自己准备好说的内容里面涉及到其他的技术点,要了解一下,防止别人发散发问.