Java反射的理解总结

来源:互联网 发布:中国网络零售规模 编辑:程序博客网 时间:2024/06/05 07:31

什么是反射?

       根据类的信息来加载这个类,然后构造这个对象,然后再调用这个类中的属性和方法。

       我个人理解就是,反射就是让你可以随便调用你没有实例化的东西,因为类在实例化之后就固定了,而反射就打破了这种固定模式,即使你的类没有被实例化加载到内存中,你一样可以在你要使用的时候找到它。

       张孝祥说:“反射就是把Java类中的各种成分映射成相应的java类”,其细节方面就是你通过自己编写代码来将类加载到java虚拟机中。

       也有人称“反射”为“类的自解析”,通过反射可以让程序变得更加灵活。

反射是审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。

反射的主要作用是用来扩展系统和动态调用程序集。
所谓扩展系统就是先把系统写好,系统里面定义接口,后面开发的人去写接口的代码。此时该系统就要用反射了,系统用反射调用接口,当接口没写,系统利用反射就不会不会出错,此时就等于没实现此功能而已,当接口被人写好了,系统就会自动调用接口的功能展现在系统上。即反射实现即插即用功能。

最主要作用就是 可以通过配置文件来动态配置和加载类,以实现软件工程里所提及的类与类,模块与模块之间的解耦。

java中主要是通过四种方式来进行class的加载的:

1.classLoader  //classLoader.loadClass(A);//在newInstance的时候进行初始化

2.类名.class.

3.对象名.getClass()

4.Class.forName();

Class.forName(A);//在类加载(载入class)的时候即进行初始化

Class.forName(A,false,classLoader);//在newInstance的时候进行初始化。

第一步是获得你想操作的类的 java.lang.Class 对象。下面就是获得一个 Class 对象的方法之一:Class c = Class.forName("java.lang.String"); //这条语句得到一个 String 类的类对象。还有另一种方法:Class c = int.class; 或者Class c = Integer.TYPE; //可获得基本类型的类信息。

第二步是调用诸如 getDeclaredMethods 的方法,以取得该类中定义的所有方法的列表。

Method m[] = c.getDeclaredMethods();

System.out.println(m[0].toString()); //以文本方式打印出 String 中定义的第一个方法的原型。

Class.forName 的作用 ? 为什么要用 ?
答: Class是运行中的class类,forName(className)是将这个名为className的类装入JVM,这样就可以动态的加载类,通过Class的反射机制可以获得此类的一些信息。Class.forName 的作用动态加载和创建Class 对象。
类加载器是用来加载.class文件,读取.class文件的字节码并加载到内存中。

java classLoader原理
Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。类装载器是用来把类 (class) 装载进 JVM 的。JVM 规范定义了两种类型的类装载器:启动内装载器 (bootstrap) 和用户自定义装载器。
    bootstrap 是 JVM 自带的类装载器,用来装载核心类库,如 java.lang.* 。java.lang.Object 是由 bootstrap 装载的。Java 提供了抽象类 ClassLoader ,所有用户自定义类装载器都实例化自 ClassLoader 的子类。

System Class Loader 是一个特殊的用户自定义类装载器,由 JVM 的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过 ClassLoader.getSystemClassLoader() 方法得到。

 

 

 

参考:http://www.the5fire.net/?p=73

 

 

0 0
原创粉丝点击