通过反射创建一个对象(三步)
第一步:获取类的信息
参数:包名+类名
Class class = Class.forName("com.javawu.reflect.Demo");
第二步:获取类的构造方法
参数:构造方法需要传递的参数的Class
Constructor constructor = class.getConstructor(String.class, int.class);
第三步:根据获取到的构造方法传递相应的参数创建对象
Demo demo = (Demo)constructor.newInstance("张三", 55);
反射机制是什么
反射机制是在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法,对于任意一个对象,能够调用它的任意一个方法和属性。
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的放射机制。
反射机制能做什么
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
获取类的类信息
//参数需要带上类所在的包名
Class class = Class.forName("com.javawu.reflect.Person");
获取类中的所有公有构造方法
Constructor[] constructors = class.getConstructors();
获取类中的所有的共有的和私有的构造方法
constructors = class.getDeclaredConstructors();
获取某个构造方法
- 获取不带参的构造方法
Constructor constructor = class.getConstructor();
- 获取参数为String和int类型的构造方法
constructor = class.getConstructor(String.class, int.class);
//传递数组参数
//Class[] params = {String.class, int.class};
//class.getConstructor(params);
- 当构造方法为private时,需要设置访问权限
constructor.setAccessible(true);
- 根据构造方法创建该类的对象
person = (Person)constructor.newInstance("参数");
获取构造方法名
constructor.getName();
获取构造方法的参数的Class数组
Class[] params = constructor.getParemeterTypes();
获取类中的所有public方法(包括父类的方法)
Method[] methods = class.getMethods();
获取类中所有的方法(不包括父类的方法)
methods = class.getDeclaredMethods();
获取指定方法名和参数的方法
//第一个参数:方法的名字 第二个参数:方法的参数的Class
Method method = class.getMethod("eat", null);
调用方法
Person person = new Person();
//第一个参数:执行方法的对象 第二个参数:方法的参数
method.invoke(person, null);
调用静态方法
method.invoke(null, 参数)
获取类中的所有public属性
Field[] fields = class.getFields();
获取类中的所有属性
fields = class.getDeclaredFields();
获取指定属性名的属性
Field field = calss.getField("name");