---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! -------------
反射
知识点总结:
1: 每个java类都是Class的一个实例对象,它们的内容不同,但是,它们的
特征相同,譬如,都有方法,有字段,有父类,有包。
2: 如何得到各个字节码对应的实例对象 :
类名.class,例如,System.class
对象.getClass(),例如,new Date().getClass()
Class.forName("类名"),例如,Class.forName("java.util.Date");
3:什么是反射:
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中
用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构
造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车
中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供
一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这
些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、
Package等等。
4:Constructor类 Constructor类代表某个类中的一个构造方法。
(1)得到某个类所有的构造方法:
例子:Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
//先得到String类的字节码,再通过字节码调用getConstructors();方法,
得到所有构造方法
(2)得到某一个构造方法:
例子 Constructor constructor = Class.forName(“java.lang.String”).
getConstructor(StringBuffer.class);
//先得到String类的字节码,通过getConstructor得到参数是
StringBuffer.class的构造方法
5:创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc"));
/ /调用获得的方法时要用到上面相同类型的实例对象
Class.newInstance()方法:
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
6:Method类:Method类代表某个类中的一个成员方法
得到类中的某一个方法:
例子: Method charAt = Class.forName("java.lang.String").
getMethod("charAt", int.class);
//得到String类中的charAt 方法
调用方法:
通常方式:System.out.println(str.charAt(1));
反射方式: System.out.println(charAt.invoke(str, 1));
如果传递给Method对象的invoke()方法的第一个参数为null,
说明该Method对象对应的是一个静态方法!
7:数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象。
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本
类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
int[] a1=new int[]{1,2,3};
int[] a2=new int[4];
int[] []a3=new int[2][3];
String[]a4=new String[]{"a","b","c"}
a1.getClass()==a2.getClass();//正确
a1.getClass()==a3.getClass();//错误
a1.getClass()==a4.getClass();//错误
a1.getClass().getSuperClass().getName();
//获取a1class对象的父类class对象的名字。
a4.getClass().getSuperClass().getName();
a1和a4都为java.lang.Object。
代表数组的class实例对象的getSuperClass().方法返回的父类为Object类对应的class
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------