黑马程序员_java总结_反射

半腔热情 提交于 2020-04-06 03:56:03

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


现在总结反射机制,个人感觉反射在JAVA中是相当重要的.我让为的反射:在java中执行一个
程序之前会先把其编译成class文件,而反射就是在运行时把已有的class文件进行反编
译的并在这个过程中,把类中的所有元素转换成JAVA中的类的一个过程,因为一个Class
文件就相当于一个类,那么反射就是以类为单位进行操作的了.对于反射的内容包括以下
几点:

1.类的字节码(Class)
2.反射时的构造方法.
3.反射时的普通方法.
4.反射时的成员变量.

1.类的字节码(Class)
要想实现反射,在JAVA中就必须借助与Class类,它是反射的基础.每一个类在编译时
都会被编译成.class 文件.而在运行时,JVM会把这些要用到的文件加载到内存中,
这时这些文件就是以一段段的字节码的形式表示的,而这些字节码也被java封装成了
一个对象,这个对象就是Class,而java中 实现反射就是以一个Class为单位操作的,
所以要实现反射就必须先有这么一个对象了.要想得到Class类的实例有三种方式:
1.类名.class;如:
Class clazz = String.class;
2.调用Class类的静态方式forName方法,它有几个重载形式,这里用传入路径的,如:
Class clazz = Class.forName("java.lang.String");
3.调用已有对象的getClass方法.如:
String str = "abc";
Class clazz = str.getClass();
另外说明一下:
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注
释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类
型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、
short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

有了字节码对象,就可以通过这个对象的方法对其进行操作,可以得到它的构造方法,普通
方法,成员变量等等.先说构造方法.

2.反射时的构造方法.
现在先用这个对象得到构造方法.有以下几种方法可以获得构造方法:

获得所有的构造方法或一个构造方法(不包括私有的)
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(Class<?>... parameterTypes)

获得所有的构造方法或一个构造方法(包括私有的)
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()

Constructor是一个用来表示构造方法的类,我们就可以用这一个Constructor对象来操
作这个构造方法了.通过这个对象,可以知道这个构造方法的更具体的信息.甚至可以用
它创建一个新的实例对象.

3.反射时的普通方法.
要获得普通方法和构造方法基本类似.可以调用以下几个方法:
获得类中的所有方法或者一个方法.(包括私有的)
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] getDeclaredMethods()
获得类中的所有方法或者一个方法.(不包括私有的)
Method getMethod(String name, Class<?>... parameterTypes)
Method[] getMethods()

Method是一个用来表示普通方法的类,我们可以从它的方法中获得一个普通方法的更具体
的信息.也可以直接调用,但是在调用时必须先得到它的参数类型和个数,并在调用时传入.

4.反射时的成员变量.
获得某个或所有的成员变量(包括私有的)
Field getDeclaredField(String name)
Field[] getDeclaredFields()

获得某个或所有的成员变量(不包括私有的)
Field getField(String name)
Field[] getFields()

Field是一个用来表示成员变量的类,可以通过它获得这个成员更具体的信息.在需要的时候
还可以通过它对这个类的一个实例的成员的值进行修改.

由此可见,我们可以通过反射把一个JAVA类文件中的基本元素都还原出来,这就相当于是一个逆向
工程呀.我喜欢.呵呵
对于反射的总结也先到此为止.关于它的应用我再写一个把类的所有元素列出来的小程序就OK了.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!