------- android培训、java培训、期待与您交流! ----------
1.Class类
Java程序中的各个Java类属于同一类事物,描述这类事物的类名就是Class。
得到字节码对应的实例对象:
(1)类名.class ;例:System.class、Date.class
(2)对象.getClass();例:new Date().getClass()
(3)Class.forName(“类名”);例:Class.forName(“java.lang.String”)
每个数组属于被映射为class对象,所有具有相同元素类型和维数的数组都共享该class对象。
九个基本类型class对象:基本java类型(boolean、btye、short、int、long、float、double、char)和关键字void 都表示为class对象。
总之:只要在源程序中出现的类型,都有各自的class实例对象,如int[]、int、void...
反射就是把Java类中的各种成分映射成相应的Java类。
2.Constructor类
(1)得到某个类的构造方法就用:getConstructor(Class<?>...param)方法
//获取String类的一个构造方法
Constructor Constructor= String.class.getConstructor(
StringBuffer.class);
//用这个构造方法创建对象
String str = (String)constructor.newInstance(
new StringBuffer("1234"));
(2)class.newInstance()方法可以创建空参数对象
例:
String str1 = (String)Class.forName(“java.lang.String”)
.newInstance();
该方法内部先得到默认的构造方法,再用默认构造方法创建实例对象。
3.Field类
用来对类中的属性进行操作。常用方法:getField(String field)、getFields()
(1)getField(String field) 获取一个属性
如果field的修饰符为public,直接用 类的对象的class文件
.getField(filed).get(类对象)访问该field成员变量;
如果是其他修饰符,则要用 类对象class文件.getDeclaredField(
field).setAccessible(true).get(类对象)访问变量,先获取任何限定的成员变量,再将其设为可访问,最后取变量值。
(2)getFields()/getDeclaredFields() 获取类中所有成员变量,得到一个变量数组。
4.methodl类
用来对类中的方法进行操作。
(1)得到类中的某一个方法
例:Method charAt = Class.forName(“java.lang.String”).getMethod
(“charAt”,int.class);
这就是取到了String类中的参数一个int类型的charAt方法。
(2)得到方法后要进行调用
例: String str = “abc”;
通常调用方法为:str.charAt(1);
而反射调用方法为:charAt.invoke(str,1)
如果传递给invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法,如main()等。
Invoke()方法:
JDK1.4版本:public Object invoke(Object obj,Object[] args);
JDK1.5版本:public Object invoke(Object obj,Object... args);
获取一个类的main()方法
String className = args[0];//传入一个类名
Method mainMethod = Class.forName(className).getMethod(“main”,
String[].class);
mainMethod.invoke(null,(Object)new String[]{“aa”,“bb”});
//调用main方法并传入参数
5.Array类
数组的反射,包含相同元素且维度相同的数组拥有同一个字节码文件,所以可以用反射来获取该数组。
常用方法:
isArray(): 判断字节码文件对象是否是数组
Array.getLength(Object array):获取数组长度
Array.get(Object array, int index):返回指定数组对象中索引组件的值
基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用;
基本类型的二维数组可以被当做Object[]类型使用;
非基本类型的一维数既可以当做Object类型使用,又可以当做Object[]类型使用。