反射
类是具有相同属性或者行为的一类事物,那么类本来也可以再被抽象,因为类们也有共同的
属性和行为,比如都有属性、构造器、方法,所以把类们又抽象成了一个类Class.
得到Class类的对象
1.通过Class.forName(类的全路径);
2.通过类的名字打点,如User.class;
3.通过该类的对象调用getClass()方法。
Field 类 类属性的抽象
Method 类 类方法属性的抽象
Constructor类 类构造器的抽象
Class clazz = Class.forName("com.reflect.User");
//获得类的所有属性
Field[] fields = clazz.getDeclaredFields();
//获得类的所有public属性
Field[] publicField = clazz.getFields();
//通过类的一个特定属性
Field field = clazz.getDeclaredField("name");
//获得类的所有方法
Method[] methods = clazz.getDeclaredMethods();
//获得类的一个具体方法
Method method = clazz.getDeclaredMethod("setName");
//获得类的构造器(参数为类构造函数的参数的类型的Class数组,如Integer.class)
Constructor constructor = clazz.getDeclaredConstructor(new Class[]{});
//根据类的默认构造器来获得一个对象(参数为值的数组)
Object instance = constructor.newInstance(new Object[]{});
//调用类的方法
method.setAccessible(true); //调用私有方法需要
method.invoke(instance,"李四");
//设置类的属性
field.setAccessible(true); //设置私有属性需要
field.set(instance,"张三");