----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
反射的基石——Class类:
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class,Class类的各个实例对象分别对应的是各个类在内存中的字节码。一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型。
有3种方法可以得到各个字节码对应的实例对象
1.类名.class,例如,System.class
2.对象.getClass(),例如,new Date().getClass()
3.Class.forName("类名"),例如,Class.forName("java.util.Date");
反射:
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
===============================Constructor类===============================
1.Constructor类代表某个类中的一个构造方法
得到某个类中的所有的构造方法(不包括私有的构造方法):
Constructor[ ] constructors= Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
如果getConstructor()方法中没有任何值,说明调用的是默认的构造方法
创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"));
=================================Method类================================
2.Method类代表某个类中的一个成员方法
得到某个类中的所有成员方法(不包括私有的成员方法):
Method[ ] methods = Class.forName("java.lang.String").getMethods();
得到某一个成员方法:
Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
如果传递给Method的对象的invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法
调用方法:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:System.out.println(charAt.invoke(str, 1));
==================================Field类================================
3.Field类代表某个类中的成员变量
得到某个类中的所有成员变量(不包括私有的成员变量):
Field[] fields = Class.forName("java.lang.String").getFields();
得到某一个成员变量:
Field field = Class.forName("className").getField("fieldName");
以下面的Person为例
public class Student { public String name; }
获得变量:
通常方式:System.out.println(new Student().name);
反射方式:System.out.println(Class.forName("cn.itcast.day1.Student").getField("name").
get(new Student()));
数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
int[] a1 = new int[3];
int[] a2 = new int[4];
System.out.println(a1.getClass() == a2.getClass()); //返回true
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
int[] a1 = new int[3];
System.out.println(a1.getClass().getSuperclass().getName()); //java.lang.Object
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
int[] a1 = new int[3];
Object[] aobj1 = a1; //int是基本类型,不是Object类型,会报错
String[] a2 = new String[]{"a", "b", "c"};
Object[] aobj2 = a2;
利用反射获取数组的值:
private static void readObject(Object obj) {
if (obj.getClass().isArray()) {
int len = Array.getLength(obj);
for (int i = 0; i < len; i++){
System.out.print(Array.get(obj, i));
}
} else {
System.out.println(obj);
}
}
----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------