简单总结Java的反射机制的运用
java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在javabean 中广泛应用的一种特性。
简单来说,一个类或者一个对象是拥有下面几种属性的:
method,constructor,field,其大致结构类图如下:
我们现在用代码来说明问题:
首先,我们看class类,在class类中,我们可以看见下面的几个重要的方法;
- getinterfaces()
- getsuperclass();
- isinterface();
这是用来得到一个类的接口或者超类,以及判断这个类是不是一个接口;
- forname(string classname);根据一个类名得到一个相应的类类型;
- getclassloader();得到这个类相应的类加载器;
以及下面的几种方法:
getfield(method/constructor)(s)(name); getdeclaredfield(method/constructor)(s)();
分别是获取这个类的相应的constructor,field,method的;
区别在于,含有declared的方法能够得到这个类所声明的所有的属性,而没有declared的只能得到公共public的属性;
而继承了member分别赋予了这个三个类能够得到声明其的class,用getdeclaringclass();在这里我们再次介绍一下modifiers,我们都知道在field或者constructor,method前面都含有若干修饰符,如:
public static final string name="corey";
等等,我们应用getmodifiers()能够拿到这个修饰符的一个整形值,然后应用modifier这个类的静态方法来进行判断;如:
modifier.isstatic(int)等等;
接下来,我们来看看accessibleobject的几个主要的方法,accessibleobject中主要的几个方式第一是
getannotation();得到某个属性的注释;
isaccessible();能否访问;如果不能访问,我们可以采取setaccessible(boolean)来设置其的可访问性;(这个我们在spring中看到过);
然后我们分别来看看这个三个类一些重要的特性:
constructor:
- newinstance(args):能够使用这个构造器得到一个类的实例;
field:
- gettype();得到这个字段的类;
- set/get(object,value):一系列的基本类型字段的设置方法或者object的设置方法;
method:
- getparametertypes();得到所有参数的类型;
- getexceptiontypes();得到所有抛出异常的类型;
- invoke(object,args);调用object对象的这个方法,参数是args;
下面是一份实例代码:
package org.corey.demo; public interface iname { public string getfirstname(); public void setfirstname(string firstname); public string getlastname(); public void setlastname(string lastname); } package org.corey.demo; public class name { private string firstname; private string lastname; public string publicname; public name(string firstname, string lastname) { this.firstname = firstname; this.lastname = lastname; } public name() { } public string getfirstname() { return firstname; } public void setfirstname(string firstname) { this.firstname = firstname; } public string getlastname() { return lastname; } public void setlastname(string lastname) { this.lastname = lastname; } } package org.corey.demo; import java.lang.reflect.constructor; import java.lang.reflect.field; import java.lang.reflect.method; public class demo { /** * @param args */ public static void main(string[] args) { try { class clazz = class.forname("org.corey.demo.name"); constructor con = clazz.getdeclaredconstructor(new class[] { string.class, string.class }); name corey = (name)(con.newinstance("corey", "zhou")); system.out.println(corey.getfirstname()+" "+corey.getlastname()); field[] fields=clazz.getdeclaredfields(); for(int index=0;index<fields.length;index++){ system.out.println(fields[index].getname()+" accessible "+fields[index].isaccessible()); } method[] methods=clazz.getdeclaredmethods(); for(int index=0;index<methods.length;index++){ system.out.println(methods[index].getname()); } field field=clazz.getdeclaredfield("firstname"); if(!field.isaccessible()){ field.setaccessible(true); field.set(corey, "syna"); } method method=clazz.getdeclaredmethod("setlastname", new class[]{string.class}); method.invoke(corey, "wang"); system.out.println(corey.getfirstname()+" "+corey.getlastname()); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } }
console:
corey zhou firstname accessible false lastname accessible false publicname accessible false getfirstname getlastname setlastname setfirstname syna wang
上一篇: java利用递归调用实现树形菜单的样式