JAVA-反射面试题及答案

一、什么是反射?
在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。
反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。

二、Java 反射主要提供以下功能:

1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
4.在运行时调用任意一个对象的方法;

三、反射使用

a. 通过一个全限类名创建一个对象
   1)、Class.forName("全限类名"); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
   2)、类名.class; 获取Class<?> clz 对象  
   3)、对象.getClass();   
   
b. 获取构造器对象,通过构造器new出一个对象 
   1). Clazz.getConstructor([String.class]); 
   2). Con.newInstance([参数]); 
   
c. 通过class对象创建一个实例对象(就相当与new类名()无参构造器) 
   1). Clazz.newInstance();

d. 通过class对象获得一个属性对象
   1)、Field c=clz.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。 
   2)、Field c=clz.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段 
   
e.  通过class对象获得一个方法对象 
   1). Clazz.getMethod("方法名",class…..parameaType);(只能获取公共的) 
   2). Clazz.getDeclareMethod("方法名");(获取任意修饰的方法,不能执行私有) 
   3) . M.setAccessible(true);(让私有的方法可以执行) 
   
f. 让方法执行 
	   1). Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的) 

四、反射优缺点

1.优点:反射可以动态创建对象和编译,最大限度发挥了java的灵活性。
2.缺点:对性能有影响。反射基本上是一种解释操作,告诉JVM我们要做什么并且满足我们的需求,这类操作总是慢于直接执行java代码。

五、哪里会用到反射机制

1.我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;
2.Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:
	1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 
	2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 
	3)使用反射机制,根据这个字符串获得某个类的Class实例; 
	4)动态配置实例的属性;

六、什么是 java 序列化?什么情况下需要序列化?

1. 序列化:将 Java 对象转换成字节流的过程。
   反序列化:将字节流转换成 Java 对象的过程。
2.注意事项:
	a.某个类可以被序列化,则其子类也可以被序列化
	b.声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
	c.反序列化读取序列化对象的顺序要保持一致  

https://xcbeyond.blog.csdn.net/article/details/100046212

七、动态代理是什么?有哪些应用?

1.动态代理是什么?有哪些应用?
动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。
Java 中实现动态的方式:JDK 中的动态代理 和 Java类库 CGLib。

2.应用场景如:
统计每个 api 的请求耗时
统一的日志输出
校验被调用的 api 是否已经登录和权限鉴定
Spring的 AOP 功能模块就是采用动态代理的机制来实现切面编程

八、怎么实现动态代理?

使用的模式:代理模式。
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。

两种动态代理:
(1)jdk动态代理,jdk动态代理是由Java内部的反射机制来实现的,目标类基于统一的接口(InvocationHandler)
(2)cglib动态代理,cglib动态代理底层则是借助asm来实现的,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。

九、Java反射创建对象效率高还是通过new创建对象的效率高

通过new创建对象的效率比较高。
通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。

你可能感兴趣的:(反射,面试,java)