回顾Java反射
Java
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java
语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。
要想解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关API(1)java.lang.Class(2)java.lang.reflect,所以,Class对象是反射的根源。
获取 Class对象,通过 Class对象完成实例化
-
1 类名.class
-
Class clazz = Car.class;
-
2 对象.getClass()
-
Class clazz = new Car().getClass();
-
3 Class.forName("全路径")
-
Class clazz = Class.forName("com.atguigu.reflect.Car");
-
通过 Class对象进行实例化创建对象
-
Car car = (Car)clazz.getConstructor().newInstance();
获取构造方法,通过构造方法完成实例化
-
1 获取所有构造
-
// getConstructors()获取所有public的构造方法 Constructor[] constructors = clazz.getConstructors(); // getDeclaredConstructors()获取所有的构造方法public private Constructor[] constructors = clazz.getDeclaredConstructors();
-
2 指定有参数构造创建对象
-
//1 构造public Constructor c1 = clazz.getConstructor(String.class, int.class, String.class); Car car1 = (Car)c1.newInstance("夏利", 10, "红色"); //2 构造private Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class); //设置允许访问 c2.setAccessible(true); Car car2 = (Car)c2.newInstance("捷达", 15, "白色");
获取属性
-
1 获取所有public属性
-
Field[] fields = clazz.getFields();
-
2 获取所有属性(包含私有属性)
-
Field[] fields = clazz.getDeclaredFields();
-
遍历所有属性,对属性进行操作
-
for (Field field:fields) { if(field.getName().equals("name")) { //设置允许访问 field.setAccessible(true); field.set(car,"五菱宏光"); System.out.println(car); } System.out.println(field.getName()); }
获取方法,通过 invoke 调用方法
-
1 public方法
-
Method[] methods = clazz.getMethods(); for (Method m1:methods) { System.out.println(m1.getName()); //执行指定方法 比如,toString if(m1.getName().equals("toString")) { String invoke = (String)m1.invoke(car); System.out.println("toString执行了:"+invoke); } }
-
2 private方法
-
Method[] methodsAll = clazz.getDeclaredMethods(); for (Method m:methodsAll) { //执行指定方法 比如,run //需要先设置允许访问 .setAccessible(true) if(m.getName().equals("run")) { m.setAccessible(true); m.invoke(car); } }