对反射机制的学习理解
来源:互联网 发布:广告字设计软件 编辑:程序博客网 时间:2024/06/06 00:43
我没学习这个视频之前,对反射可以说是一无所知,等学习了这个视频后,才了解到反射的作用,原来我们还可以从类反推回去找到定义的方法,这引起了我对反射学习的很大的兴趣。以下是我学习反射时候的一些总结。
通常我们使用类都是找到类的路径,然后再实例化类的对象,反射就是通过类的实例化对象找到类的位置。
实例化Class类对象的方法有三种:
第一种:通过forName()方法
第二种:类.class
第三种:对象.getClass()
Class主要是反射的源头,不光可以取得对象所在类的信息,也可以直接通过Class类的方法进行对象的实例化操作正常情况下,使用关键字new为对象实例化,如果现在已经实例化好了class对象,则就可以通过Class类中提供的newInstance()方法
如果要想调用有参,则必须按照以下的步骤进行:
1. 通过Class类中的getConstructors()取得本类中的全部构造方法
2. 向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。
3. 之后通过Constructor实例化对象。
但是从实际角度看,如果要使用反射进行对象的实例化操作,最好在类中存在无参构造
在实际开发中,以上的程序就是反射应用最多的地方,当然,反射机制所提供的功能远不止如此,还可以通过反射得到一个类的完整结构,那么这就要使用到java.lang.reflect包中的以下几个类:
Constructor:表示类中的构造方法
Field:表示类中的属性
Method:表示类中的方法
这三个类都是AccessibleObject类的子类
取得类所实现的全部接口,如果要想取得一个类所实现的全部接口,可以使用Class类中的getInterface()方法,因为一个类可以同时实现多个接口,所以在此处将以一个数组的形式返回实现的全部接口。
取得类所继承的父类,一个类只继承一个父类,如果一个类没有明确说明继承哪个类,则肯定继承的是Object类,可使用函数getSuperclass();
取得类所有的构造方法,可以使用getConstructor()方法,返回Constructo类型的数组。
Constructor类中存在以下的几个方法:
取得修饰符:public int getModifiers()
取得方法名称:public String getName()
取得参数的类型:public Class<?> getParameterType()
从之前的程序结果中可以发现,已经取得了构造方法的方法名称及参数类型,但是在取得权限的时候却发现返回的是一个数字而不是public,这是因为在整个JAVA中对于方法的修饰符是使用一定的数字表示出来的,而如果要想把这个数字还原成用户可以看懂的的关键字,则必须依靠Modifier类完成,此类定义在java.lang.reflect包中。直接使用Modifier类下的toString()方法即可还原修饰符。
要想取得一个类的全部方法,可以使用Class类中的getDeclaredMethods()(返回本类异常)方法、getMethod()(返回Object类的全部方法)方法,此方法返回一个Method类的对象数组,而如果要想进一步取得方法的具体信息,例如:方法的参数,抛出的异常声明等等,则就必须依靠Method类。
方法操作:取得全部的返回值:getReturnType()
取得全部的参数:getParameterType()
取得修饰符:getModifiers()
取得异常信息:getExceptionTypes()
在反射操作中也同样可以取得一个类中的全部属性,但是在取得属性的时候有以下两种不同的操作:得到实现的接口或父类中的公共属性:getField();得到本类中的全部属性:getDeclaredFields()。这两种方法返回的都是Field的数组,每个Field对象就表示类中的一个属性。
通过反射调用类中的方法,在正常情况下一个类的对象产生之后,就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚的知道要调用的方法的名称是什么,之后通过Class类中的getMethod()方法,得到一个方法的Method对象,之后通过此Mehtod对象来执行方法,但是方法调用的时候因为会牵扯到方法中的参数的问题,所以通过getMethod()取得的时候,必须设置好需要的参数类型。
执行调用的方法:invoke(),执行的时候还需要传递参数进去,而且需要实例化对象。
通过反射调用属性:如果现在假设要操作一个类中的属性,则也可以通过Filed完成,而不必麻烦的通过setter及getter。此操作与类里的set,get方法无关,即类里没有这两个方法也可完成。
得到公共属性:getFiled()’
得到本类属性:getDeclaredField()
取得属性内容:get()
设置属性内容:set()
在访问私有属性的时候,必须让这个属性可见,将setAccessible()设置为true即可。
反射机制不光可以用在类上,也可以应用在任意的引用数据类型上,当然,这就包含了数组,数组使用Array类完成。使用getComponentType()即可。得到数组指定的下标的内容:public static Object get(Object array,int index)。修改内容:public static void set(Object array,int index).
- 对反射机制的学习理解
- 对java反射机制的理解
- 对c# 反射机制的理解
- 对java反射机制的一些理解
- 对java反射机制的理解
- 关于对反射机制的通俗理解
- 反射机制的理解
- 黑马程序员:我对 反射机制 的理解
- 对Java反射机制的理解(1)
- 对反射的理解
- 关于反射机制的理解和Assembly的学习(反射机制二)
- java 反射机制的理解
- java反射机制的理解
- Java 反射机制的理解
- java反射机制的理解
- Java 反射机制的理解
- java的反射机制理解
- Android 反射机制的理解
- Android瀑布流实例,类似加载相册
- 修改android4.0 Launcher2 桌面的列数/行数/屏幕数
- Generic Reflection
- ie下弹出窗口设置
- oracle导出表结构到sql文件
- 对反射机制的学习理解
- 十进制小数转二进制小数方法
- delete与delete[]
- Spring简单入门实例
- 设置鼠标样式
- django admin自定义
- 使用ListPreference时,列表框中不显示内容
- vbs 的 GB2312ToUnicode
- easyUI属性汇总