反射概述:
1.反射是指对于任何一个Class类,在"运行的时候"都可以直接得到这个类全部成分。
2.在运行时,可以直接得到这个类的构造器对象:Constructor
3.在运行时,可以直接得到这个类的成员变量对象:Field
4.在运行时,可以直接得到这个类的成员方法对象:Method
5.这种运行时动态获取类信息以及动态调用类中成分的能力称为Java语言的反射机制。
反射的第一步:获取Class类对象,如此才可以解析类的全部成分:
Class c1 = Class.forName(“全类名”);//方式一(常用) Class<类名> c2= 类名.class;//方式二 Class c3 = 对象.getClass();//方式三(对象传过来的) /*拓展*/ /*读取配置文件*/ Properties properties = new Properties(); properties.load(this.getClass().getClassLoader().getResourceAsStream("配置文件路径")); String vualue = properties.getProperty("要读取配置文件的key");
通过Class获取构造器创建对象:
/*获取到Class对象*/ Class<类名> 对象x= 类名.class; /*基于Class对象,获取到构造器(Constructor)*/ Constructor<类名> constructor = 对象x.getConstructor();//方法中没有指定参数类型,故获取到的是无参构造方法 /*利用构造器,创建对象*/ 类名 对象= constructor.newInstance();//无参构造方法中不需要传递具体的数据 Constructor<类名> constructor = 对象x.getConstructor(参数类型.class ,参数类型.class);//基于Class对象,获取public修饰的全参构造方法 类型 对象= constructor.newInstance(实参1, 实参二);//使用构造器,创建对象 /*基于Class对象,“获取私有的构造方法”*/ Constructor<类名> 对象y= 对象x.getDeclaredConstructor(参数类型.class); cons.setAccessible(true);//取消权限检查。原因:idea有权限检查限制 类 对象= 对象y.newInstance(实参); /*基于Class对象,获取所有的构造方法(包含:私有)*/ Constructor>[] constructors = userClass.getDeclaredConstructors(); for (Constructor> cons : constructors) { ······ }
通过Class调用类方法
/*获取Class对象*/ Class<类名> 对象x = Student.class; 类名 对象y= 对象x.newInstance();//可以使用Class类中的newInstance()方法直接调用Student类中的无参构造创建对象 /*基于Class对象,获取到Method对象(成员方法对象)*/ Method method= 对象x.getMethod("类的方法名");//获取public修饰的无参study方法 /利用Method对象,运行方法*/ method.invoke(对象y); /*基于Class对象,获取到所有的public修饰的Method对象(成员方法对象)*/ Method[] methods = 对象x.getMethods();//获取本类中的public修饰的方法,以及父类中的方法 /*基于Class对象,获取到本类所有的方法(包含:私有)*/ Method[] methods = 对象x.getDeclaredMethods(); //基于Class对象,获取带参数方法 Method method = 对象x.getMethod("方法名", 类型.class); /*利用Method对象,运行方法*/ method.invoke( 对象y, "张三"); //基于Class对象,获取私有的方法 Method method = 对象x.getDeclaredMethod("私有方法名", 参数类型.class, ····); method.setAccessible(true);//取消权限检查。原因:idea有权限检查限制 Object result = method.invoke(对象y,实参,····); //3、利用Method对象,运行方法 (如果知道返回值类型,Object 可以换成具体类型) /*基于Class对象,获取静态方法*/ Method method = 对象x.getDeclaredMethod("静态方法", 参数类型.class); /*利用Method对象,运行方法*/ method.invoke(null, 实参);//静态方法的调用是通过 : 类名.静态方法,所以用null填空
通过Class获取类的属性:
/*获取Class对象*/ Class<类名> 对象x= 类名.class; 类名 对象y= 对象x.newInstance(); /*基于Class对象,获取public修饰的Field对象(成员变量)*/ Field[] fields = 对象x.getFields(); for (Field field : fields) { ·····} /*基于Class对象,获取所有的Field对象(包含:私有成员变量)*/ Field[] fields =对象x.getDeclaredFields(); for (Field field : fields) { ·····} /*基于Class对象,获取public修饰的Field对象,给成员(属性赋值)*/ Field field = 对象x.getField("属性名1"); /*利用Field对象,赋值、取值 (成员变量,也称为:实例变量,是通过对象名来访问)*/ field.set( 对象y,实参);//赋值 Object result = field.get(对象y);//获取属性名1的值 /基于Class对象,获取私有成员变量*/ Field field = 对象x.getDeclaredField("私有成员(属性)"); field.setAccessible(true);//取消本次权限检查。原因:idea有权限检查限制 /*利用Field对象,赋值、取值 (成员变量,也称为:实例变量,是通过对象名来访问)*/ field.set( 对象y,实参);//赋值 Object result = field.get(对象y);//获取私有成员(属性)的值
还没有评论,来说两句吧...