- 加载类,返回Class类型对象(类对象) Class.forName(全类名) //字节码是对象
- 创建实例、返回 Class对象.newInstance() //实例是对象
- 通过字节码对象得到方法对象 Class对象.getMethod(方法名) //方法是对象
- 通过方法对象来实现调用方法 方法对象.invoke(实例)
可以再不修改源码的情况下,通过控制配置文件来控制程序----灵活
缺点:反射是解释执行,对执行速度有影响 适当优化:Method、Field、Constructor类型的对象都有setAccessible方法
Java反射:加载完类之后,通过类加载器会在在堆中会产生一个Class类型的对象(1个类只有1个),这个对象包含了类的完整信息结构。
不同阶段获取类对象:任何阶段 类加载阶段及以后,因为已经有了类对象,直接取就可以 运行阶段( 运行类型)
1) Class.forName(全类名) 2) 类.class 3) 实例.getClass()
4)通过类加载器获得:1.获取类加载器:实例.getClass().getClassLoader() 2.通过类加载器得到类对象ClassLoader.loadClass(全类名)
5)基本数据类型获得类对象:基本数据类型.class
6)基本数据类型的包装类获得类对象:包装类.TYPE
类加载时机:1.new 2.子类被加载时 3.调用类的静态成员 4.通过反射*(动态加载)
静态加载:编译时加载相关类,如果没有相关类侧报错,依赖性强 //类如在A类依赖B类,如果没有A类在编译时会记载B类
动态加载:运行时加载相关类,运行时没有用到相关类,即使不存在则不会报错,降低了依赖 //使用反射机制返回类对象时ÿ