反射常见问题

收集到一些反射知识点,都忘了

https://blog.csdn.net/qq_37875585/article/details/89340495

 

1,什么是反射

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

2,哪里用到反射机制

1)jdbc中利用反射动态加载了数据库驱动程序

2)web服务器中利用反射调用了sevlet的服务方法

3)eclipse等开发工具利用反射解析对象的类型与结构,动态提示对象的属性与方法

4)很多框架都用到反射机制,注入属性,调用方法,比如spring中用beanId获取bean来执行bean的方法,常用的工具类:ReflectionUtils,ReflectionUtils.invokeMethod(method, obj, args);method 方法实体,obj bean实体,args参数执行成功返回object对象。

3,反射机制的优缺点

优点:可以动态执行,在运行期间根据业务功能动态执行方法,访问属性,最大限度发挥了java的灵活性

缺点:对性能有影响,这类操作总是慢于直接执行java代码

4,获取类的三种方式

  1. Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
  2. 类名.class; 获取Class<?> clz 对象
  3. 对象.getClass();

//第一种方式:  
Class c1 = Class.forName(User);  
//第二种方式:  
//java中每个类型都有class 属性.  
Class c2 = User.class
//第三种方式:  
//java语言中任何一个java对象都有getClass 方法  
User u = new User();  
Class c3 = u.getClass(); //c3是运行时类 (e的运行时类是User)

5,通过反射创建对象

- 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()

- 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");

6,方法

方法关键字 含义
getDeclaredMethods() 获取所有方法
getReturnType() 获取方法的返回类型
getParametertypes() 获取方法的入参类型
getDeclaredMethod("方法名",参数类型.class,……) 获取特定方法
   
构造方法关键字  
getDeclaredConstructors() 获取所有的构造方法
getDeclaredConstructor(参数类型.class....) 获取特定的构造方法
   
父类和父接口  
getSuperclass() 获取某类的父类
getInterfaces() 获取某类实现的接口

7,动态代理是什么,有那些应用

动态代理是运行时动态生成代理类

动态代理的应用有springaop数据查询,测试的mock,和java的注解

8,怎么实现动态代理

jdk原声动态代理和cglib动态代理

jdk原生动态代理是基于接口实现的,而cglib是基于继承当前类的子类实现的

9,什么叫对象序列化,反序列化

对象序列化,将对象的数据编码为字节序列的的过程

反序列化:将对象的编码字节重新反向解码为对象的过程

java提供了api实现了对象的序列化和反序列化:

1)被序列化的对象类型需要实现序列化接口,实现Serializable接口

2)为了保持序列化过程的稳定,建议在类中添加序列化版本号

3)不要让字段放在硬盘上就加transient

以下情况需要使用序列化:

1)想把内存中的对象状态保持到一个文件中或者数据库中的时候

2)想用套接字在网络上传送对象的时候

3)想通过远程方法调用传输对象的时候

10,深拷贝与浅拷贝

浅拷贝:当对象被复制是只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制

深拷贝:除了对象本身被复制外,对象所包含的所有成员变量都被复制

11,为什么要使用克隆,如何实现

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

实现cloneable接口并重写clone()方法

实现serializable接口,通过序列化和反序列化实现克隆,实现深拷贝 

你可能感兴趣的:(java基础)