反射是指程序在运行状态中,
1,可以对任意一个类,都能够获取到这个类的所有属性和方法。
2,对于任意一个对象,都可以调用它的任意一个方法和属性
反射是一种能力
一种在程序运行时,动态获取当前类对象的所有属性和方法的能力,可以动态执行方法,给属性赋值等操作的能力
Class代表的就是所有的字节码对象的抽象,类
反射,让我们的java程序具备动态性
这种动态获取类信息及调用对象方法的功能称为反射
在java中,Class类就是关键API
public class Reflection { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { //1.以class对象为基础 Class<?> clazz = Class.forName("com.reflection.Student"); System.out.println(clazz); //2.类中每一部分,都有对应的类与之匹配 //表示属性的类 Field nameField = clazz.getField("name"); //表示方法的类 Method helloMethod = clazz.getDeclaredMethod("hello", String.class); //表示构造方法的类 Constructor<?>[] constructors = clazz.getConstructors(); } }
这种能力带来很多的好处,在我们的许多框架的背后实现上,都采用了反射的机制来实现动态效果。
框架是提供一种编程的约定
比如@Autowrie 就能实现自动注入
@Autowrie
private IUserService userService;
注解的解析程序,来扫描当前的包下面有哪些属性加了这个注解,一旦有这个注解,就要去容器里面获取对应的类型的实现,然后给这个属性赋值。
思考题:如何实现一个IOC容器?