Java中反射机制: 容许运行中的程序对自身进行检查,并能直接操做程序内部的属性或者方法。
理解: JAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;
对于任意一个对象,都可以调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制java
反射机制的实现借助4个类: class(类对象),
Constructor(类的构造器对象),
Field(类的属性对象),
Method (类的方法对象)数组
注意点: 利用反射机制在Java程序中,动态的去调用一些protected甚至是private的方法或类函数
获取对象的方法:
1. getClass(): Object对象.getClass() 每一个类都有此方法
2. Class.forName() 不少开发中,会直接经过类的名称取得Class类的对象
3. .class属性ui
获取构造方法:
1.getConstructors() 返回全部具备public属性的构造函数数组
2.getConstructor(Class[] params) 根据构造函数的参数,返回一个具体的具备public属性的构造函数
3.getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
4.getDeclaredConstructors() 返回该类中全部的构造函数数组(不分public和非public属性)this
获取方法对象:
1.getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具备public属性的方法
2.getMethods() 返回全部具备public属性的方法数组
3.getDeclaredMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的方法(不分public和非public属性
4.getDeclaredMethods() 返回该类中的全部的方法数组(不分public和非public属性)对象
注意点:方法getDeclaredMethods()只能获取到由当前类定义的全部方法,不能获取从父类继承的方法
方法getMethods() 不只能获取到当前类定义的public方法,也能获得从父类继承和已经实现接口的public方法继承
获取属性对象:
1.getField(String name) 根据变量名,返回一个具体的具备public属性的成员变量
2.getFields() 返回具备public属性的成员变量的数组
3.getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)
4.getDelcaredField() 返回全部成员变量组成的数组(不分public和非public属性)接口
实例化类对象的方法:
1.利用Constructor类调用newInstance()方法
2.利用Class类自己的newInstance()方法建立一个实例开发
实例: 经过java中反射技术阻止,点击按钮后关闭对话框,即不让按钮关闭 例如,输入校验码,密码之类的校验问题
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);get
builder.setMessage("您肯定退出吗?") .setTitle("友情提示") .setNegativeButton("取消", null) .setPositiveButton("肯定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { /* * 源码中有一个boolean变量是控件对话框的关闭与否的mShowing变量, * 咱们只须要利用反射改变这个变量就能够控制咱们的对话框是否是关闭了 */ try { Field field=dialog.getClass().getSuperclass().getDeclaredField("mShowing"); field.setAccessible(true); field.set(dialog, false);//将mShowing变量设置为false, 表示不关闭对话框 field.set(dialog, true);//将mShowing变量设置为false, 表示关闭对话框 } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }); AlertDialog alert = builder.create(); alert.show();