Java高级---反射机制

java反射
运行时,对于一个java类,能否知道这个类的属性和方法,能否动态调用它的方法,答案是肯定的。就是通过反射来完成。
首先看2个过程
1*.java----->*.class    编译过程
2*.class---->*.java     反编译过程


反射:反省机制,程序运行时,检查自身的属性和方法。
每个类在加载编译时,都会生成一个*.class类文件,都会有一个Class类与之对应;这个Class类保存了各个类的所有
详细信息,包括每个类的属性、方法和构造方法,通过反射,可以获取任意一个对象的  相关类信息,


几个主要的相关类
Class:保存各个类的所有信息
获得Class类对象三种方法
1、Class cls = Class.forName("包名.类名");
2、Class cls = Student.class();[类名.class()]
3、Student stu = new Student();
  Class cls = stu.getClass();


Field:属性
Class cls = Student.class();
Field[] field1= cls.getFields();//获得public属性
Field[] field = cls.getDeclaredFields();//获得所有的属性


Modifier:访问权限   Modifier.toString(f.getModifiers());//返回某个字段的  访问修饰符
//字段数组,保存从Student类中,获取到的所有属性
Field[] field = cls.getDeclaredFields();
for (Field f : field) { //输出每个属性,和对应的 访问权限
System.out.println(f.getName()+"\t"+Modifier.toString(f.getModifiers()));
}


Method:方法
  Student stu = new Student();
  Class cls = stu.getClass();
Method[] ms = cls.getDeclaredMethods();  //找出所有的(非构造)方法
//通过方法名"setAge"和方法参数类型Integer.class[是一个Class对象],找出具体方法,返回一个Method
Method setMethod = cls.getDeclaredMethod("setAge", new Class<?>[]{int.class});
setMethod.invoke(stu,new Object[]{21});//动态调用类方法,相当于执行stu.setAge(21);






Constructor:构造方法
Constructor[] cons = cls.getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);  //输出所有重载的构造方法

}
Constructor<?> con = cls.getConstructor();//获得无参构造方法
Object newObject = con.newInstance();//通过无参构造方法,new一个实例





你可能感兴趣的:(动态)