反射:
java反射机制的定义:对于任意一个类(class文件),都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象方法的功能被称为java语言的反射
动态获取类中信息,就是java反射(可以理解为对类的解剖)
想要对一个类文件进行解剖,只要获取到该类的字节码文件对象即可
(P.S.所谓的框架就是对外提供一些接口,对功能进行扩展,由实现类按照这个接口标准去实现。而框架内部内部要操作这些实现类的对象,只需读取配置文件即可,利用反射技术创建这个实现类的对象并且调用相应的方法完成一些操作)
Class类就是字节码文件类,要解剖类,只需得到class类的对象即可
获取Class类对象(字节码文件对象)有3中方式:
1.Object类中的getClass()方法
Person p = new Person();
Class clazz = p.getClass();
2.类的静态属性.class
Class clazz = Person.class;
3.Class类的forName(String name)方法
String className = "cn.itcast.bean.Person";
Class clazz = Class.forName(className);
获取Class中的构造方法:
1.调用空参构造函数来获取对象
Object obj = clazz.newInstance();
2.调用有参数的构造函数来获取对象
Constructor constructor = clazz.getConstructor(int.class, String.class);
Object obj = constructor.newInstance(22,"小明");
对比一下:都是newInstance()方法得到对象,但是一个是直接的,一个是间接的(constructor)
获取Class中的字段:
Field field = clazz.getField("age");---getField()只能获取所有可访问的公关字段,private获取不到
Field field = clazz.getDeclaredField("age");---可以访问私有字段
field.aetAccessible(true);---对私有字段的访问取消权限检查,暴力访问
field.set(obj , 21);
获取Class中的方法:
Method[] methods = clazz.getMethods();---获取的都是公有方法
methods = clazz.getDeclaredMethods();---获取所有的方法(包括石油)
Method method = clazz.getMethod("show",null);---获取某个空参函数
Method method = clazz.getMethod(
|