设为首页 加入收藏

TOP

Java反射总结
2015-11-10 13:45:01 来源: 作者: 【 】 浏览:9
Tags:Java 反射 总结

能够分析类能力的程序称为反射。对于给定的Java类名,可以通过反射获取类的信息、将类的各成分映射出相应的Java类。


? ? 在程序运行期间,Java运行时系统始终对所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class


创建Class类对象的三种方法:


1. 通过getClass方法


? ? Object中的getClass方法将返回一个Class类型的实例。


2. forName方法


? ? 可以通过静态方法forName获得类名对应的Class对象。


? ? 如果需要在运行过程中需要改变类名,就可以使用这种方法。当然,字符串className必须是一种类名或接口(包括包名),否则会出现异常。


3. T.class


? ? T表示任意的Java类型。通过T.class获取匹配的类对象。


虚拟机为每个类型管理一个Class对象。因此可以用==运算符来实现两个类对象的比较


? ? 通过newInstance方法可以创建一个类的实例。


? ? 创建了一个与p具有相同类类型的实例。newInstance调用默认的构造器初始化创建的对象。如果这个类没有默认的构造器,就会抛出异常。


【运行结果】:
获取类名:com.xiaoxiaoyihan.reflection.Student
获取父类名:com.xiaoxiaoyihan.reflection.Person


一点扩展:


首先看一个例子:


【运行结果】:
com.xxyh.reflec.Person<--->萧萧弈寒
com.xxyh.reflec.Animal<--->paqi


由此说明,一个Person对象p表示一个特定人的属性,一个Animal对象a表示一个特定动物的属性,一个Class对象表示一个特定类(Person或Animal)的属性。从这点看,Class的实例是一种对象


Class类中的getConstructors方法将返回公共构造器数组。Class类中的getDeclaredConstructors将返回类中声明的构造器数组。


【运行结果】:


private com.xiaoxiaoyihan.reflection.Person()
protected com.xiaoxiaoyihan.reflection.Person(java.lang.String)
public com.xiaoxiaoyihan.reflection.Person(java.lang.String,int)


// public com.xiaoxiaoyihan.reflection.Person(java.lang.String,int)// 本部分为运行getConstructors方法输出结果


对结果加以分析,会发现通过System.out.println(c);直接打印的构造函数是由几部分组成的,其中包括了修饰符(public/protected/private)、类名以及构造函数的参数,那么,这些部分是如何获取的呢?


Modifier类中包含静态方法getModifiers方法,它返回一个整数i,用不同的数值表示public、static、final这样的修饰符。Modifier中的静态方法toString(i)返回对应的修饰符。Constructor类中包含由静态方法getParameterTypes,它返回一个描述参数类型的Class对象数组


【运行结果】:


private com.xiaoxiaoyihan.reflection.Person();
protected com.xiaoxiaoyihan.reflection.Person(java.lang.String);
public com.xiaoxiaoyihan.reflection.Person(java.lang.String,int);


Class类中的getMethods将返回方法的数组,其中包括本类的所有方法、从接口实现的方法、父类的公共(public)方法、父类的父类的公共方法……一直延伸到Object的公共方法getDeclaredMethods方法将返回本类声明的方法、从接口实现的方法


【运行结果】:


public void com.xiaoxiaoyihan.reflection.Student.smoking()
protected void com.xiaoxiaoyihan.reflection.Student.protectedMethodStudent()
private void com.xiaoxiaoyihan.reflection.Student.privateMethodStudent()
public void com.xiaoxiaoyihan.reflection.Student.publicMethodStudent()


上面的例子故意给出一种继承结构,是为了查看getMethods的结果,在此就不给出结果了。注意Person默认继承了Object类。顺便说一句,笔者(非科班自学菜鸟)曾在面试的时候被问到Object中有哪些方法,估计他是想问有哪些常用方法吧,我没答全~2333,不知道读者您能一眼看出结果吗??。


类似地,我们看到上面的System.out.println(m);打印出方法由修饰符返回值类名方法名以及参数组成。那么这些部分是如果获取的呢? 与Construction类相似,Method类中也提供了静态方法getParamTypes,该方法返回描述参数类型的Class对象数组。此外,Method还提供了getReturnType方法,用于获取返回类型的Class对象。


【运行结果】:
public java.lang.String getName();
public void setName();
public static void speak();
public final void eat();


Class类中的getDeclaredFields方法返回类中声明的域数组,getFields方法返回类中的公有域、接口中的域所组成的Field对象数组。


【运行结果】:
public static final java.lang.String com.xiaoxiaoyihan.reflection.Smoke.brand
public java.util.Date com.xiaoxiaoyihan.reflection.Person.birthday


? ? 结果显示了字段由修饰符类型类名字段名构成。这里需要引入Field类中的getType方法,它返回字段声明类型的Class对象。下面同样作出解析:


【运行结果】:


private java.lang.String java.lang.String;
protected int int;
public java.util.Date java.util.Date;?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java对象初始化 下一篇Java按值传递还是引用传递?

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: