二十一.反射 |
类对象 当虚拟机进行类加载时,会将读进的信息保存类对中并放置在堆里,类对象对应的模板叫做Class 类的对象 以某个类为模板创建出的对象 我们称之为类的对象 |
一.如何获取一个类对象 需要掌握 |
1.通过类的对象调用getClass() 方法获取类对象 Student student = new Student(); Class class1=student.getClass(); 2.类名.Class的形式获取类对象 Class c=Student.class; 3.通过Class类的静态方法forName()来获取 Class.forName(一个类的全类名/全限定名) 类的全类名/全限定名:从包名写起,写到类名 比如com.baizhi.day1.TestClass Class forName=Class.forName("day27.Student"); 4.类加载的触发条件(触发到初始化阶段) (1)第一次创建某个类的对象时,会让该类的类加载进行到初始化阶段 (2)第一次通过 类名.静态成员的形式调用静态属性 或 静态方法时,会让该类的类加载进行到初始化阶段 (3)子类类加载时,如果父类没有类加载,会让父类先进行类加载,并进行到类加载的初始化阶段 (4)使用Class.forName()方法来获取类对象时,也会触发该类对象所对应类的类加载 |
二.类对象的使用 需要熟悉 |
1.获取一个类的相关信息 (1)获取方法信息 获取一个指定的公开方法 getMethod(String name,Class<?>...paraneterTypes); name是方法名是字符串,第二个参数是关于方法参数表的描述,每个参数数据类型后都要加上.class 例: Class<?> c= Class.forName("day27.Student"); Method method=c.getMethod("sleep",int.class,String.class); System.out.println(method); 获取一个指定的方法 Method getDeclaredMethod(String name,Class<?>...parameterTypes) 获取所有公开方法 包含父类 Method[] getMethods() 获取所有的方法 不含父类的 Method[] getDeclaredMethods() (2)获取属性信息 获取一个公开属性 Field getField(String name) name是属性的名字 获取指定的任意属性 Field getDeclaredField(String name) 获取所有公开属性 包含父类 Field[] getFields() 获取所有属性 不包含父类 Field[] getDeclaredFields() (3)获取构造方法信息 获取公开的构造方法 Constructor<T> getConstructor(Class<?>...parameterTypes) 获取指定的构造方法 Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes) 获取所有公开的构造方法 Constructor<?>[] getConstructors() 获取所有构造方法 Constructor<?>[] getDeclaredConstructors() 2.如何使用获取到的类信息 (1)创建类的对象 a.通过类对象newInstance()方法——使用该类的无参构造创建对象 这个类型一定要有无参构造 Class<?> c=Class.forName("day27.Student"); Student stu=(Studen)c.newInstance(); b.通过获取的构造器对象来创建类的实例——可以灵活的指定使用有参构造还是无参构造 Constructor<?> constructor=c.getConstructor(String.class,double.class,int .class); Student stu=(Student)constructor.newInstance("zzz",10.0,15); (2)调用类的方法 使用Method对象的 Object invoke(Object obj,Object...args)哪个对象执行该方法,填入的参数 Method method=c.getMethod("study",String.class); method.invoke(stu,"Java"); (3)能给某个对象的属性赋值 使用Field对象的 void set(Object obj,Object value) 给哪个对象的 这个属性进行赋值 Field field=c.getField("name"); field.set(stu,"zzz"); (4)甚至这些操作可以忽视所有修饰符 在使用属性对象或方法对象时,如果他们是私有的则需要先调用其void setAccessible(true) 属性对象 方法对象 构造方法对象均有 setAccessible方法用来忽视修饰符 Field field=c.getDeclaredField("age"); //忽视修饰符 field.setAccessible(true); field.setInt(stu,2); System.out.println(stu); |
Java基础(21)反射
最新推荐文章于 2022-09-15 16:28:49 发布