----------- android培训、java培训、期待与您交流! ------------
反射:就是将Java类中的各种成分映射成相应的Java类。
Class类:Class类是一种用来描述类的类。它描述了Java中所有类对象的属性,包括:字段(Field),方法(Method),构造函数(Constructor),实现的接口(Interface)等等。我们知道Class文件是反射的基础。(一个类的Class文件在内存中只能存在一份,这也是为什么在多线程安全问题中,我们可以用一个类的字节码文件作为锁的原因)通常,获取一个类的字节码文件的方法又以下3种:
这里还涉及到了一点小知识,就是可以通过isPrimitive()来判断一个类是否是基本类型。
9个预定义的Class实例对象包括:byte.class、short.class、char.class、boolean.class、int.class、float.class、long.class、double.class外加void.class。判断示例如下:
System.out.println(void.class.isPrimitive());//返回true
通过反射获取一个类的构造函数(Constructor):
通过getConstructor(parameterTypes)方法可以获得某个类中具有某种特定参数类型的构造函数。
通过getConstructors()方法可以获取到某个类中所有的构造方法
还可以通过getDeclaredConstructor(parameter Types)方法来获取到私有的构造方法。具体示例如下:
通过反射获取一个类的字段(Field):
可以通过getField(String args)获得该类中的某个字段
可以通过getFields()方法获得该类所有的字段
如果要获取私有的成员变量,就要使用getDeclaredFields(),并使用setAccessible(true)来实现对该成员的访问。实例如下:
通过反射获取一个类的方法(Method):
通过getMethod(函数名,函数对应的参数列表) 获取类中的一个指定方法。如果没有参数,可以为null,也可以直接不写
getMethods()方法可以获取到所有的类中方法。
使用getDeclaredMethod(函数名,函数对应的参数列表) 可以获得类中的私有方法。具体示例如下:
假设自定义的一个Person类中有一个静态方法,private setName(String name); 那么,要获取到该方法,可以:
Person p = new Person();
Method setMethod=Person.class.getDeclaredMethod(“setName”,String.class);
setMethod.setAccessable(true);
setMethod.invoke(p,"zby");//调用invoke方法执行该对象的setName方法。
通过反射来调用数组。
首先,具有相同纬度且元素类型相同的数组的字节码文件是相同的,即它们具有相同的Class对象。其次,要验证一个Class对象的父类是不是Object,可以用getSuperClass()方法来验证。其它的结合以下示例来说明:
下面为数组的反射调用实例:
----------- android培训、java培训、期待与您交流! ------------