收集到一些反射知识点,都忘了
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,获取类的三种方式
- Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
- 类名.class; 获取Class<?> clz 对象
- 对象.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接口,通过序列化和反序列化实现克隆,实现深拷贝