java中的反射机制
- 定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
- 功能
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行是获取泛型信息
5.在运行时调运任意一个对象的成员变量和方法
6.在运行时处理注解
7.生成动态代理
java反射字节码对象方式:
方法 |
示例 |
对象名.getClass() |
stu.getClass();(前提条件是必须对象存在) |
类名.class |
Student.class |
Class.forName(“包名.类名”) |
Class.forName(“util.Student”) |
Class 类的方法
方法 |
功能 |
newInstance() |
创建此类的对象(实例化的类一定有无参数的构造函数,否则不能被实例化) |
getField(String name) |
返回此类的或者接口指定name的公共属性(返回值为Field类型) |
getFields() |
返回此类的或者接口所有的公共属性(返回值为Field类型的数组) |
getMethod(String name, 类<?>… parameterTypes) |
返回此类的或者接口指定name,指定参数的公共方法(返回值为Method类型) |
getMethods() |
返回此类的或者接口所有的公共方法(返回值为Method类型的数组) |
getDeclaredField(String name) |
返回此类的或者接口指定name的所有属性(返回值为Field类型) |
getDeclaredFields() |
返回此类的或者接口所有的属性(返回值为Field类型的数组) |
getDeclaredMethod(String name, 类<?>… parameterTypes) |
返回此类的或者接口指定name,指定参数的所有方法,parameterTypes参数的写法为:参数类型.class(返回值为Method类型) |
getDeclaredMethods() |
返回此类的或者接口所有的方法(返回值为Method类型的数组) |
Filed类的方法
方法 |
功能 |
equals(Object obj) |
将此 Field与指定对象进行比较 |
get(Object obj) |
返回该表示的属性的值(返回值为Object,参数obj为指定的该对象) |
setAccessible(boolean boo) |
此方法为父类AccessibleObject的方法,赋予操作对象私有属性的权限,参数true为是,false为否 |
set(Object obj, Object value) |
obj为指定的该对象,方法的作用是设置该表示属性的值为value |
Method类中的方法
方法 |
功能 |
equals(Object obj) |
将此 方法与指定对象进行比较 |
getName() |
返回该方法的名字(返回值为String) |
invoke(Object obj, Object… args) |
执行此方法,obj为指定该对象,args为需要的参数, |
举例
Student类
public class Student {
private String name;
private int num;
public Student(){
}
public Student(String name, int num) {
this.name = name;
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", num=" + num +
'}';
}
public void play(int a){
System.out.println("输出参数为"+a+"的方法");
}
}
Class,Filed,Method某些方法的测试
public class text {
public static void main(String[] args) {
try {
//根据反射创建Class对象
Class cls = Student.class;
//创建类Student的对象stu
Student stu = (Student) cls.newInstance();
//获取指定名字的私有属性
Field field = cls.getDeclaredField("name");
Field field1 = cls.getDeclaredField("num");
//设置操作私有属性的权利
field.setAccessible(true);
field1.setAccessible(true);
//设置私有属性的值
field.set(stu,"张三");
field1.set(stu,1);
//获取指定名字的方法,及形参的写法
Method method = cls.getDeclaredMethod("toString",null);
Method method1 = cls.getDeclaredMethod("play", int.class);
//执行方法,参数为执行方法的对象
System.out.println(method.invoke(stu));
//执行方法,参数为执行方法的对象,及该方法需要的参数
method1.invoke(stu,666);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注:类中的方法只写了一些部分方法,日后有需要,即使补充。