反射概述:
反射是指对于任何一个Class类,在“运行的时候”都可以直接得到这个类全部成分
在运行时,可以直接得到这个类的构造器对象:Constructor
在运行时,可以直接得到这个类的成员变量对象:Field
在运行时,可以直接得到这个类的成员方法对象:Method
这种运行时动态获取类信息以及动态调用类中成分的能力成为Java语言的反射机制。
反射的关键:
反射的第一步都是先得到编译后的Class类对象,然后就可以得到Class的全部成分。
获取Class类对象的三种方式:
方式一:Class c1 = Class.forName("全类名");
方式二:Class c2 = 类名.class;
方式三:Class c3 = 对象.getClass();
获取构造器对象
获取构造器对象的四种方式:
方式一:Constructor[] constructors = c1.getConstructors();
方式二:Constructor[] constructors = c1.getDeclaredConstructors();
方式三:Constructor constructor = c1.getConstructor(Class...parameterTypes);
方式四:Constructor constructor = c1.getDeclaredConstructors(Class...parameterTypes);
获取成员变量对象
获取成员变量对象的俩种方式:
方式一:Field[] fields = c1.getDeclaredFields();
方式二:Field field = c1.getDeclaredField("名称");
获取方法对象
获取方法对象的两种方式:
方式一:Method[] methods= c1.getDeclaredMethods();
方式二:Method method = c1.getDeclaredMethod("方法名", Class... parameterTypes);
反射的作用-绕过编译阶段为集合添加数据
反射是作用在运行时的技术,此时集合的泛型将不能产生约束了,此时是可以为集合存入其他任意类型的元素的
泛型只是在编译阶段可以约束集合只能操作某种数据类型,在编译成Class文件进入运行阶段的时候,其真实类型都是ArrayList了,泛型相当于被擦除了。
反射的作用:
可以在运行时得到一个类的全部成分然后操作;
可以破坏封装性; (很突出)
也可以破坏泛型的约束; (很突出)
更重要的用途是适合:做Java高级框架