介绍

JAVA反射机制是指:在运行状态中,对于任意一个【类】,都能够知道这个类的所有属性和方法;对于任意一个【对象】,都能够调用它的所有属性和方法;这种【动态】获取类中的信息以及动态调用对象的成员的功能称为java语言的反射机制。 

程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby,PHP,OC,JS等是动态语言,而C,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

早期,new一个对象的时候,需先根据被new的【类的名称】找寻该类的【字节码文件】, 然后加载进内存,并自动创建该【字节码文件对象】 ,接着创建该字节文件对应的【该类的对象】
现在,可以先根据被new的【类的名称】找寻该名称的【类文件】,然后加载进内存,最后通过【Class对象】的newInstance方法产生【该类的对象】

PS:字节码文件即.class文件,是经过【编译器预处理过】的一种文件,是JAVA的执行文件存在形式。它本身是二进制文件,但是不可以被系统直接执行,而是需要虚拟机解释执行,由于被预处理过,所以比一般的解释代码要快,但是仍然会比系统直接执行的慢。

示例

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
        ).getClass();//java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    }
}
因为泛型只在编译的时候起作用,,在运行的时候,你得ArrayList已经不受泛型的控制了,也就是说跟普通的ArrayList已经没有区别。而反射直接获得了add方法的字节码,跳过编译层在运行时直接添加,这样就骗过了编译。
作用嘛,比如你的这个集合里存放int类型的数据,但是有及个别的地方需要添加其他类型的数据。就可以用上了! String类型的存进去就是String类型出来。