1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2、new创建对象:是静态加载类,在编译时刻就需要加载所有的【可能使用到的类】。有一个类有问题(如不存在),都不能通过编译,会报错。
3、Class.forName()通过动态加载类,可以用到一个类时,才进行加载。
【功能性的类尽量使用动态加载,并对新添的类实现功能性接口(标准),这样就不用重新编译】
类类型的获取有三种方式,假设已知Student类,则
方式一: Class c1 = Student.class;
方式二:Student stu = new Student(); Class c2 = stu.getClass();
方式三:已知Student类在包:com.javaweb.top包下,则 Class c3 = Class.forName(com.javaweb.top.Student”);
//构造函数也是对象,java.lang.Constructor中封装了构造函数的信息
//getContructors获取所有public的构造函数
//getDeclaredContructors得到所有的构造函数
Constructor[] cs = c.getContructors();
//成员变量也是对象,java.lang.reflect.Field,Field类封装了关于成员变量的操作
//getFields()方法获取的时所有的public的成员变量的信息
//getDeclaredFields获取的是该类自己声明的成员变量的信息
Field[] fs = c.getFields();
Class fieldType = field.getType() //得到成员变量的类型的类类型
Java反射机制——通过反射了解集合泛型的本质
1:反射的操作都是编译之后的操作;就是运行阶段
2:java中集合的泛型是防止错误输入的;只在编译阶段有效,只要绕过编译就无效啦
我们可以通过方法的反射来操作,绕过编译
一、如何获取某个方法:方法的【名称】和【方法的参数列表】才能【唯一确定】某个方法
1、要获取一个类的某个方法,需要先得到类类型
2、通过Class.getMethod(name,parameterTypes)获得public的该方法:如c.getMethod(“print”,new Class[]{int.class,int.class})或者参数写成int,int; ——> 来获取 public void print(int a,int b)
3、同样getDeclaredMethdo(name,paramterTypes)获得自己声明的该方法
二:方法的反射操作;就是用method对象进行方法调用;当然还是需要传参的
method.invoke(对象实例,参数列表)
2.1:invoke(user,new Object[]{10,20})倘若没有参数就可省略:invoke(user)
2.2:invoke(user,10,20)//直接传参