浅谈Java反射
说java反射之前先说说java的类加载。
类加载是什么?直白的说就是将类的class文件读取到内存并创建对象的过程,通常类的加载都是由系统完成,当然我们也可通过继承ClassLoader来实现自己的类加载,ClassLoader的方法大多都可以被重写。将类加载后回生成一个对应的java.lang.Class对象,程序通过此对象即可获取该对象的真实信息。
那么反射是什么?反射也是类加载的一种方式。我们都知道程序运行有编译状态和运行状态,对象其实也分编译类型和运行类型,比如:Animal a = new Animal(); 这段代码在编译时会生成一个名词为a的变量,Animal对象实际上还没实例化,当程序运行时则会实例化对象Animal,也就是在堆内存里开辟了一个对象空间,a变量指向了这个对象的引用。好,那么如果我们有个名为Dog的java类,程序中没有任何地方或方式去实例化它,那么我想调用Dog类中的变量的话,应该用何种方式实现呢?答案有很多种,如Class.forName("Dog")方法就可以获取Class对象,得到Class对象后我们可以通过getMethods()和getFields()等方法获取对象对应类的方法和public成员变量。实际上getMethods()和getFields()方法返回的是Method对象和Field对象,这两个对象都位于java.lang.reflect包下,程序可通过这两个对象执行对应的方法等。
OK,我们转回来,得到Class对象有很多种方式,得到了Class对象后我们可以通过newInstance()方法来创建Class对象对应的实例。java的反射有很广泛的应用,如JDK动态代理,而spring的AOP使用的核心技术就是动态代理,即可以通过JDK的动态代理为任意的java对象创建代理对象。
以上内容仅是对反射的粗浅理解,如有错误敬请指正。