JAVA的反射机制
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
获取类的三种方法(以Student类为例):
1.Class c1=Class.forName("包名.Student");
2.Class c2=Student.class;
3.Student student=new Student();
Class c3=student.getClass();
常用:this.getClass();
创建对象:
//获取类
Student student=new Stusdent();
Class c1=student.getClass();
//获取类以后,创建对象
Object obj=c.newInstance();//调用了Student类的无参构造方法
获取属性:分为所有属性和指定属性。
getFields getDeclaredFields
返回的是申明为public的属性,包括父类中定义, 返回的是指定类定义的所有属性,不包括父类的。
1.获取所有属性
//获取类
Class c2=Student.getClass();
Field [ ] fields=c2.getDeclaredFields();
//创建StringBuffer用来存储属性
StringBuffer sb=new StringBuffer();
for(Field field :fields){
sb.append(Modifier.toString(c2.getModifiers())+"class"+c2.getSimpleName());//输出是修饰符名+class+类名:eg. public class Student
sb.append(Modifier.toString(field.getModifiers()+""));//添加修饰符名
sb.append(field.getType().getSimpleName());//添加属性类型名
sb.append(field.getSimpleName());//添加属性名
}
2.获取指定属性:
//获取类
Class c2=Class.forName("包名.Student");
//获取指定属性
Field field=c2.getDeclareField("no");
//先实例化对象,然后为属性赋值
Object obj=c2.newInstance();
//打破封装
field.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
field.set(obj,"2015110999");//obj为实例化之后的对象,2015110999为定义的属性值
//获取o对象的field属性的值
field.get(o);
获取方法:分为普通方法和构造方法。
方法名 含义
getDeclaredMethods() 获取所有方法
getReturnType() 获取方法的返回值类型
getParameterTypes() 获取方法的传入参数类型
getDeclaredMethod("方法名",参数类型.class) 获取特定的方法
构造方法
getDeclaredConstructors() 获取所有的构造方法
getDeclaredConstructor(参数类型.class) 获取特定的构造方法
父类和父接口
getSuperClass() 获取某类的父类
getInterfaces() 获取某类的父接口