反射
Java反射机制:是指在运行时取获取一个类的变量和方法信息,然后通过获取到的信息来创建对象,调用方法的一种机制,由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期酒完成确定,在运行期仍然可以扩展。
获取class类的对象
要想通过反射取使用一个类,首先要获取到该类的字节码文件对象,也就是类型为Class类型的对象,这里我们提供三种方式:
使用类的class属性来获取该类对应的class对象,举例:Student。Class将会返回Student类对应的class对象,
调用对象的getClass()方法,返回该对象所属类对应的class对象
该方法是object类中的方法,所有的Java对象都可以调用该方法
使用Class类中的静态方法forname(String className):该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径。
public class persontest {
public static void main(String[] args) throws ClassNotFoundException {
//三中获取class对象的方式
//1 通过class.foename("全类名来获取")
Class cls1 = Class.forName("junit.person");
//2中通过类名。class方式
Class cls2 = person.class;
//3种方式
person p1 = new person();
Class cls3 = p1.getClass();
System.out.println(cls3);
System.out.println(cls2);
System.out.println(cls1);
}
}
反射重点:
反射是框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编程
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:可以在程序运行过程中,操作这些对象,
可以解耦,提高程序的可扩展性
7;;获取class对象的方式:3种方式
Class,for Name
多用于配置文件,将文件名定义在配置文件中,读取文件,加载类
类名.class
多用于参数的传递
对象。Getclass();
多用于对象的获取字节码的的方式
结论:同一个字节码文件(*。Class)在一次运行过程中,只会被加载一次,不论通过哪一种方式获取的class对象都是同一个
package junit;
public class persontest {
public static void main(String[] args) throws ClassNotFoundException {
//三中获取class对象的方式
//1 通过class.foename("全类名来获取")
Class cls1 = Class.forName("junit.person");
//2中通过类名。class方式
Class cls2 = person.class;
//3种方式
person p1 = new person();
Class cls3 = p1.getClass();
System.out.println(cls3);
System.out.println(cls2);
System.out.println(cls1);
}
}
反射获取构造方法并使用
Constructor<?>[] getConstructors():返回所有公共构造方法对象数组
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象数组
Constructor<T>[] getConstructors(Class<?>,,,,parameterTypes):返回单个公共构造方法对象
Constructor<T>[] getDeclaredConstructor(Class<?>,,,,parameterTypes):返回单个构造方法对象数
//获取所有public修饰的构造方法
Constructor[] constructors = c.getConstructors();
for(Constructor constructor:constructors){
System.out.println(constructor);
}
//获取所有构造方法
Constructor[] declaredConstructors = c.getDeclaredConstructors();
for(Constructor declaredConstructor:declaredConstructors){
System.out.println(declaredConstructor);
}
//获取带参构造函数对象
Constructor con1 = c.getDeclaredConstructor(String.class,int.class,String.class);
//通过带参构造函数对象
Object obj1 = con1.newInstance("林青霞",23,"北京");
System.out.println(obj1);
组
反射获取成员变量并使用
Field[] getFields():返回所有公共成员变量对象的数组
Field【】getDeclaredFields();返回所有成员变量对象的数组
Field[] getField(String name):返回单个公共成员变量对象
Field【】getDeclaredFields(String);返回单个成员变量对象
成员变量反射练习
Constructor con = c.getConstructor(); Object obj = con.newInstance(); System.out.println(obj);
Field addressField = c.getField("address"); // 给obj对象的addressField 字段设置值为"北京" addressField.set(obj, "北京"); System.out.println(obj);
反射获取成员方法并使用
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
Method[]getDeclarerdmethods();返回所有成员对象的数组,不包括继承的
MethodgetMethod(String name,Class<?>…parameterTypes):返回单个公共成员方法对象
Method getDeclarerdmethod(String name, Class<?>…parameterTypes);返回单个成员对象
Method m2 = c.getMethod("method", String.class);
m2.invoke(obj, "你好");