Java中反射机制: 允许运行中的程序对自身进行检查,并能直接操作程序内部的属性或者方法。
理解: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
反射机制的实现借助4个类: class(类对象),
Constructor(类的构造器对象),
Field(类的属性对象),
Method (类的方法对象)
注意点: 利用反射机制在Java程序中,动态的去调用一些protected甚至是private的方法或类
获取对象的方法:
1. getClass(): Object对象.getClass() 每个类都有此方法
2. Class.forName() 很多开发中,会直接通过类的名称取得Class类的对象
3. .class属性
获取构造方法:
1.getConstructors() 返回所有具有public属性的构造函数数组
2.getConstructor(Class[] params) 根据构造函数的参数,返回一个具体的具有public属性的构造函数
3.getDeclaredConstructor(Class[] params) 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
4.getDeclaredConstructors() 返回该类中所有的构造函数数组(不分public和非public属性)
获取方法对象:
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);
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();