泛型
在Java中的泛型简单来说就是:在创建对象或调⽤⽅法的时候才明确下具体的类型
好处是:代码更加简洁(不再需要强制转换),程序更加健壮(在编译期间没有警告,在运⾏期就不会出现ClassCastException异常), 类型限制提高程序的类型安全
集合中常用,IDEA也不建议使用原生集合,也就是没有添加泛型的
另外就是基础组件了,为了通用行会用到泛型
--java3y《对线面试官》
什么事泛型擦除
编译阶段使用泛型,运行阶段取消泛型,就是泛型擦除
反射
反射就是Java可以给我们在运⾏时获取类的信息
运行时:在编译器写的代码是 .java ⽂件,经过javac 编译会变成 .class ⽂件,class ⽂件会被JVM装载运⾏(这⾥就是真正运⾏着我们所写的代码(虽然是被编译过的),也就所谓的运⾏时
在运⾏时获取类的信息,其实就是为了让我们所写的代码更具有「通⽤性」和「灵活性」,一般用在工具上
像SpringMVC 你在⽅法上写上对象,传⼊的参数就会帮你封装到对象上
Mybatis可以让我们只写接⼝,不写实现类,就可以执⾏SQL
你在类上加上@Component注解,Spring就帮你创建对象
都有反射的身影:约定⼤于配置,配置⼤于硬编码
通过”约定“使⽤姿势,使⽤反射在运⾏时获取相应的信息(毕竟作为⼀个”⼯具“是真的不知道你是怎么⽤的),实现代码功能的「通⽤性」和「灵活性」
泛型是会擦出的,为什么反射能获取到泛型的信息
(泛型的信息只存在编译阶段,在class字节码就看不到泛型的信息了)
泛型擦除是有范围的,定义在类上的泛型信息是不会被擦除的。Java 编译器仍在 class ⽂件以 Signature 属性的⽅式保留了泛型信息
动态代理
动态代理其实就是代理模式的⼀种,代理模式是设计模式之⼀
代理模型有静态代理和动态代理。静态代理需要⾃⼰写代理类,实现对应的接⼝,⽐较麻烦
在Java中,动态代理常⻅的⼜有两种实现⽅式:JDK动态代理和CGLIB代理
JDK动态代理其实就是运⽤了反射的机制,⽽CGLIB代理则⽤的是利⽤ASM框架,通过修改其字节码⽣成⼦类来处理
JDK动态代理会帮我们实现接⼝的⽅法,通过invokeHandler对所需要的⽅法进⾏增强
标签:反射,Java,代理,擦除,泛型,动态 From: https://www.cnblogs.com/deity-night/p/17177826.html