赞
踩
一、什么是反射?
在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创建对象的效率比较高。
通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。