反射
概念:反射就是在运行状态中,对任意一个类,都能知道它的属性和方法。对任意一个对象,都能调用它的方法和属性,包括私有。这种动态的获取信息及动态的调用对象的方法的功能,成为反射。
获取Class字节码文件的三种方式:
1、通过Object类的getCLass()方法。如: Person p = new Person(); Class c1 = p.getClass();
2、通过数据类型的静态属性,数据类型.Class。如: Class c2 = Person.Class;
3、通过Class类的静态方法,forName()。如:Class c3 = Class.forName("cn.itcast_01.Person");
用过反射创建对象的两种方法:
1、通过Class类的方法,由无参构造创建对象。Object obj = c.newInstance();
2、通过Constructor对象,指定构造方法创建对象。Object obj2 = con.newInstance();
通过得到字节码文件对象,也就是得到该类的Class文件对象,我们就可以得到它的成员变量、构造方法、成员方法。
而反射,是以类的形式体现他们的。通过该类的对象可以使用相应的方法,来使用它们。
成员变量:Field
构造方法:Constructor
成员方法:Method
练习:
通过反射获类的私有字段并使用。步骤:
1、得到该类的字节码文件对象。Class c = Class.forName("xxxx");
2、通过反射创建对象。Constructor con = c.getConstructor(); Object obj = con.newInstance();
3、通过反射获取成员变量。 Field nameField = c.getDeclaredField("name");
4、设置取消权限访问检查。nameField.setAccessible(true);
5、使用该字段。nameField.set(obj,"张三");
通过反射获取类的私有成员并使用。步骤:
1、得到该类的字节码文件对象。Class c = Class.forName("xxxx");
2、通过反射创建对象。Constructor con = c.getConstructor(); Object obj = con.newInstance();
3、通过反射获取成员方法。Method method = c.getDeclaredMethod("show");
4、设置取消权限访问检查。nameField.setAccessible(true);
5、使用该方法。method.invoke(obj);
|