反射
1、java反射的作用是什么?
反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时调用任意一个对象的方法
2、Java反射创建对象效率高还是通过new创建对象的效率高?
通过new创建对象的效率比较高。通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低。3、如何创建反射?
使用new关键字
使用Java反射机制,反射构造器
Class cl = Class.forName("com.gun.classforName.Users");
使用克隆方式创建对象Cloneable
UserDto dto2 = dto.clone();
使用序列化Serializable
/** * 序列化方式创建对象 * @author jkl * */ public class TestSerializable { public static void main(String[] args) throws Exception { HolleDto dto = new HolleDto(); dto.setId(2022); dto.setAge(35); dto.setName("王米兰"); outPutStream(dto); HolleDto dto2 = outPutStreamBack(); System.out.println(dto==dto);// 返回 true : 表明两个对象是相对的 System.out.println(dto.equals(dto2));//返回: false System.out.println(dto.hashCode());// 865113938 System.out.println(dto2.hashCode()); //1808253012 System.out.println(dto.toString());// HolleDto [id=2022, name=王米兰, age=35] System.out.println(dto2.toString()); // HolleDto [id=2022, name=王米兰, age=35] } //序列化对象 public static void outPutStream(HolleDto dto){ String path = "G:\\spring-work\\java-juc\\myguyuyun\\holle.txt"; File file = new File(path); FileOutputStream fos; try { fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(dto); } catch (IOException e) { e.printStackTrace(); } } //反序列化对象 public static HolleDto outPutStreamBack( ) throws ClassNotFoundException{ String path = "G:\\spring-work\\java-juc\\myguyuyun\\holle.txt"; HolleDto dto = null ; File file = new File(path); FileInputStream fis ; ObjectInputStream ois; try { fis = new FileInputStream(file); ois = new ObjectInputStream(fis); dto =(HolleDto) ois.readObject(); } catch (IOException e) { e.printStackTrace(); } return dto; } }4、反射的实现方式都有什么?
答:获取Class对象,有4种方法:(1)Class.forName(“类的路径”);(2)类名.class;(3)对象名.getClass();(4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象。
5、实现java反射的类有什么?
答:(1)Class:表示正在运行的Java应用程序中的类和接口,注意所有获取对象的信息都需要Class类来实现; (2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限; (3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限; (4)Method:提供类或接口中某个方法的信息。
6、反射机制的优缺点:
优点:(1)能够运行时动态获取类的实例,提高灵活性; (2)与动态编译结合Class.forName(‘com.mysql.jdbc.Driver.class’);//加载MySQL的驱动类 缺点:使用反射性能较低,需要解析字节码,将内存中的对象进行解析。 其解决方案是:通过setAccessible(true)关闭JDK的安全检查来提升反射速度;多次创建一个类的实例时,有缓存会快很多;ReflflectASM工具类,通过字节码生成的方式加快反射速度。
7、Java反射API有几类?
答:反射 API 用来生成 JVM 中的类、接口或则对象的信息。 (1)Class 类:反射的核心类,可以获取类的属性,方法等信息。 (2)Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。 (3)Method 类:Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。 (4)Constructor 类:Java.lang.reflec 包中的类,表示类的构造方法。
8、反射使用步骤(获取Class对象、调用对象方法)
答:(1)获取想要操作的类的Class对象,他是反射的核心,通过Class对象我们可以任意调用类的方法。 (2)调用 Class 类中的方法,既就是反射的使用阶段。 (3)使用反射 API 来操作这些信息。
9、Java反射机制的作用有什么?
答:作用有(1)在运行时判断任意一个对象所属的类;(2)在运行时构造任意一个类的对象;(3)在运行时判断任意一个类所具有的成员变量和方法;(4)在运行时调用任意一个对象的方法。
10.什么是反射?
反射是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制
11.哪里用到了反射机制?
JDBC中,利用反射动态记载了数据库驱动程序 Web服务器中利用反射调用了Servlet的服务方法 很多框架都用到了反射机制,注入属性,调用方法,spring
12.什么叫对象序列化?什么是反序列化?实现对象序列化需要那些工作?
对象序列化,将对象中的数据 编码为 字节序列的过程 反序列化:将对象的编码字节重新反向解码为对象的过程 JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵循一些约定: 1.被序列化的对象类型需要实现序列化的功能,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。 为了保持序列化过程的稳定,建议在类中添加序列化版本号。 不想让字段放在硬盘上就加transient 以下情况需要使用 Java 序列化: 想把的内存中的对象状态保存到一个文件中或者数据库中时候; 想用套接字在网络上传送对象的时候; 想通过RMI(远程方法调用)传输对象的时候。
13.什么是动态代理?有哪些应用?
动态代理是运行时动态生成代理类。 动态代理的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。
14.如何实现动态代理?
JDK 原生动态代理和 cglib 动态代理。 JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
克隆
1.为什么要使用克隆
克隆的对象可能包含一些已经修改过的属性,而new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“对象”就靠克隆方法了。
2.如何实现克隆
实现cloneAble 接口并重写 Object类中的 clone() 方法。
实现 Serialzable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
3.深拷贝和浅拷贝的区别
浅拷贝:当对象被复制时值复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
深拷贝:除了对象本身被复制外,对象所包含的所有的成员变量也将复制。
提供一个详细介绍深拷贝和浅拷贝的地址:https://juejin.cn/post/6844904197595332622