泛型(Generics),是指在定义时不指定信息的具体数据类型,而是暂时用一个 标识符 来代替,当外部实例化对象的时候再来指定具体的数据类型 (定义时不指定,使用标识符代替,使用时指定)。
优点: 极大提升程序的灵活性,提升类/接口的拓展性,泛型可以指代类中成员变量的数据类型,方法的返回值类型以及方法的参数类型。




? 表示可以任意类型的泛型对象。
所谓的泛型擦除,官方名叫“类型擦除”。
Java的泛型是伪泛型,这是因为Java在编译期间,所有的类型信息都会被擦掉。
也就是说,在运行的时候是没有泛型的。
JAVA反射机制是在 运行状态 中,对于任意一个类,都能够知道这个 类的所有属性和方法 ;对于任意一个对象,都能够调用它的任意一个方法和属性;这种 动态获取的信息以及动态调用对象方法的功能 称为java语言的反射机制。
反射就是在运行时获取类的 所有属性和方法(如构造器、成员变量、成员方法),得到编译后的class文件对象 是Java反射的核心。
通过java语言中的反射机制可以 操作字节码文件(可以读和修改字节码文件。)通过反射机制可以操作代码片段(class文件)。
如常见的 SSM框架中、动态代理、注解 等。




反射 API 用来生成 JVM 中的 类、接口或对象 的信息。
① Class类: 反射的核心类,可以获取类的属性,方法等信息。
② Field类: Java.lang.reflect 包中的类,表示类的成员变量,可以用来获取和设置类中的属性值。
③ Method类: Java.lang.reflect 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
④ Constructor类: Java.lang.reflect 包中的类,表示类的构造方法。
⑤ Annotation类: 类的注解。
取得Class类对象的一个最直接的好处就是 通过反射实例化对象,该方法为:


注意: JDK 动态代理有一个最致命的问题是其 只能代理实现了接口的类。(即一个类没有实现接口,那么JDK动态代理无法代理)

静态代理:手动编写代理类,实现接口(接口一旦改动,代理类和实现类都需要修改)



动态代理是在 运行时 动态生成类字节码,并加载到JVM中,不需要手动创建代理类、实现接口,可以直接代理实现类。
常见的动态代理,如 JDK动态代理、CGLIB动态代理 等。

通过 反射 来接收被代理的类,在不改变原来目标方法功能的前提下,在代理中增强自己的功能代码。并且要求 被代理的类必须实现一个接口 。
JDK动态代理的核心 是InvocationHandler接口和Proxy类。
答:因为JDK动态代理生成的对象 默认是继承代理Proxy ,Java不支持多继承,所以JDK动态代理要基于接口来实现。
答:不会,内部调用方法使用的对象是目标对象本身,被调用的方法不会经过代理对象。
静态代理是代理类在编译期间就创建好了,在编译时就已经将接口,被代理类,代理类等确定下来。如果有很多类很多接口需要代理,那么就只能使用代码提前写死,不够灵活;
使用了动态代理之后,不需要手动创建代理类,全部交给代理去完成对代理类的创建,实现无侵入式的代码扩展,这也是符合面向对象编程原则的操作。




注解是一种标记,使类或接口附加额外信息,帮助编译器和JVM完成一些特定功能,例如 @Override —— 标识一个方法是重写方法。
元注解 是自定义注解的注解,例如:
@Target : 约束作用位置;
@Rentention : 约束生命周期;
@Documented : 表明这个注解应该被 javadoc 记录。
注解生命周期有3大类,分别是:

