1.Class:所有的.class字节码文件的对象
* 获取字节码文件对象的三种方式
* 1.在Object类中 有一个方法 Class getClass方法 返回此 Object 的运行时类。
Person p = new Person();
Class c1 = p.getClass();
* 2.任意一个类包括基本类型 都有一个静态属性 class 可以通过这个静态属性 获取到Class对象
* Class c2 = Person.class;
*
* 3.通过Class 这个类静态方法 获取 static Class<?> forName(String className)
Class c3 = Class.forName("demo2.Person");
2.Constuctor:所有构造方法的对象
* 获取带参构造方法 并运行
* 1.获取字节码文件对象
* 2.通过字节码文件对象获取构造带参方法
* Class类的方法
* Constructor<T> getConstructor(Class<?>... parameterTypes)
* Constructor con = c.getConstructor(String.class,int.class);有参构造
* 返回值类型
* Constructor 描述构造方法的类
* 参数列表
* Class<?>... parameterTypes 可变参数 参数的数据类型 如果是String参数 写String.class
*
* 3.通过构造调用 newInstance方法运行构造方法
* Constructor方法
* T newInstance(Object... initargs)
* Object obj = con.newInstance("柳岩",38);有参
* 返回值
* T 代表泛型 没加泛型 就是Object
* 参数 空参构造不需要写参数 带参的需要给实际参数
使用字节码文件对象创建对象的快捷方式
前提:该类必须有空参构造方法,且该空参构造方法为public修饰的
1.获取字节码文件对象
2.调用字节码文件对象方法直接创建对象
Class类中
T newInstance() 创建此 Class 对象所表示的类的一个新实例。
获取私有的构造方法
获取字节码文件对象
Class c = Class.forName("cn.itcast2.Person");
获取私有的构造方法
Constructor con = c.getDeclaredConstructor(int.class,String.class);
取消私有的权限
con.setAccessible(true);
调用方法
Object obj = con.newInstance(38,"柳岩");
3.Filed:描述成员变量的类
* 反射获取成员变量并赋值
*
* 1.获取字节码文件对象
* 2.通过字节码文件对象 调用方法获取成员变量
* Class类中的方法
* Field[] getFields() 返回所有public修饰的成员变量
* 返回值类型
* Field是描述成员变量的类
* Field[] getDeclaredFields() 返回所有的成员变量
* Field getField(String name) 返回指定成员变量名的成员变量 public
* Field getDeclaredField(String name) 返回指定变量名的成员变量 包括私有也可以返回
*
* 3.通过成员变量对象调用方法为成员变量赋值
* Field的方法
Class c = Class.forName("cn.itcast2.Person");
Field field = c.getField("sex");
* void set(Object obj, Object value) 为指定对象的属性赋值
Object obj = c.newInstance();
field.set(obj, "女");
* obj:指定的对象
* value:为这个对象当前属性赋的新值
3.Method:描述成员方法的对象
* 获取带参成员方法并调用
*
* 1.获取字节码文件对象
* 2.使用字节码文件对象 获取到要运行方法
* Class的方法
* Method getMethod(String name, Class<?>... parameterTypes)
* 获取指定名称的成员方法
* name: 方法名
* parameterTypes:方法的参数的类型 例如 String String.class 因为是可变参 所以不写调用就是空参方法
*
* 3.运行此方法
* Method类的方法
Class c = Class.forName("demo2.Person");
Method m = c.getMethod("eat",int.class);
Object obj = c.newInstance();
m.invoke(obj,5);
* Object invoke(Object obj, Object... args)
* obj:对象
* args:实际参数
* 返回值Object 是方法的返回值
*/
* 获取私有的方法并运行
* 1.获取字节码文件对象
* 2.通过字节码文件对象获取方法
* 3.将检查访问权限取消
* 4.调用方法
4.泛型的擦除:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(11);
Class c = list.getClass();
Method md = c.getMethod("add", Object.class);
md.invoke(list, "柳岩");
md.invoke(list, "唐嫣");
System.out.println(list);
反射机制:
动态获取的信息以及动态调用对象的方法的功能
运行状态中,对于任意一个类,都能知道这个类所有的属性和方法;
对于任意一个对象,都能调用他的任意一个方法和属性 |