一:反射概念
Java的反射机制是指在运行状态中,对于任意一个类,动态获取信息以及动态调用对象方法的功能。记住一句话“万物皆可对象”。
二:实现的功能
通过java反射,可以实现
1:在运行的时候判断任意对象所属的类;
2:在运行的时候构造任意类的对象;
3:在运行的时候判断任意类的方法和属性;
4:在运行的时候调用任意对象的方法
三:获取的方法
它有三种获得class对象的方法
//方法一
//使用Class的静态方法forName().
Class c=Class.forName("类所在的包+类名");
//方法二
//调用对象的getClass方法
//new一个要创建类的对象
Student student=new Student();
Class c=student.getClass();
//方法三
//调用类的class属性
Class<Student> c=Student.Class;
四:常用的类
java的反射核心类是Class类,Field类是表示类的属性,它可以获取或者设置类的属性的值,
Method类是表示类的方法,它可以获取类中方法的信息或者执行那个方法。
Constructor类表示类的构造方法。
五:创建对象的方法
反射有两种创建对象的方法:
一种是使用Class对象的newInstance()方法来创建对象
另一种是使用Constructor对象创建对象。
两者区别在于:
第一种是要求该Class对象的对应类中有默认的构造方法。实际上他是利用默认构造方法来创建该类的实例。
第二种是先使用Class对象获取指定的Constructor对象,然后再调用Constructor对象的newInstance()方法来创建该Class对象对应的实例。通过该方法可以使用某个类指定的构造方法来创建实例。
//获取Person的 无参构造方法 的对象
Constructor constructor = c.getConstructor();
System.out.println(constructor.getName());
//获取带参的构造方法的对象
System.out.println("带参的" );
Constructor constructor1 = c.getConstructor(new Class[]{String.class, Integer.class, String.class});
System.out.println(constructor1.getName());
//根据构造方法对象来完成类对象的实例化
Object o = constructor.newInstance();//等价于Object obj=new Person();
System.out.println(o);
六:访问类的属性
反射中使用Field对象来获取对象的属性。
需要注意的是获得的属性分仅获得公开的(public)属性和全部的属性,可以用不同的方法来获取。
七:访问类的方法
使用Method对象可以调用对象的的方法,在Method类中包含一个invoke()方法,代码如下:
Method showMsg = c.getMethod("showMsg");
showMsg.invoke(o1,null);
showMsg.invoke(o,null);
Method getName = c.getMethod("getName");
Object invoke = getName.invoke(o1, null);
Method setName = c.getMethod("setName");
System.out.println(invoke);
八:注意点
虽然反射大大的提高了代码的灵活性,但是不能滥用,因为使用反射创建对象的时候,性能会稍微降低一些。只有需要动态创建某个类的对象时才会使用,通常在开发通用性比较广的框架,基础平台的时候会大量使用。