Java的反射机制
2014-09-29 16:57
513 查看
使用Java的反射机制获取类的对象,有如下几种方法:
![](http://img.blog.csdn.net/20140929170301676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVib183MjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
使用第二种方式获取类的对象并调用方法:
使用Java的反射机制,可以获取Person类中声明的所有方法,如下面的代码所示:
![](http://img.blog.csdn.net/20140929170635162?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVib183MjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过调用getMethods()方法,可以获取Person类中的所有方法,包括父类中的方法,如下面的代码:
![](http://img.blog.csdn.net/20140929200648843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVib183MjU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
类似的,我们可以通过反射机制得到Person类中的字段,有两个方法:getFields()和getDeclaredFields(),具体使用就不详细说明
另外,反射机制中还可以获取类的构造方法,使用getConstructors() 或 getDeclaredConstructors(),下面把这三对方法总结如下:
*getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关
通过获取类中的方法,我们可以调用这些方法,主要使用invoke来实现对方法的调用,如下面的代码:
Person p = (Person) Class.forName("Person").newInstance();或者:
Person p = Person.class.newInstance();这里的Person类就是一个Java bean,代码如下:
public class Person { private String name; private int age; public Person(){ } public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void speak(){ System.out.println("hello, my name is " + name + ", I am " + age + " years old!"); } }下面测试通过反射获取Person类的对象并调用对象的方法:
<span style="white-space:pre"> </span>public static void main(String[] args) throws Exception{ Person p = (Person) Class.forName("Person").newInstance(); p.setName("yubo"); p.setAge(12); p.speak(); }执行结果为:
使用第二种方式获取类的对象并调用方法:
<span style="white-space:pre"> </span>public static void main(String[] args) throws Exception{ Person p = Person.class.newInstance(); p.setName("yubo"); p.setAge(12); p.speak(); }执行结果跟上一种方法的结果相同
使用Java的反射机制,可以获取Person类中声明的所有方法,如下面的代码所示:
<span style="white-space:pre"> </span>Method[] methods = Person.class.getDeclaredMethods(); for(int i = 0; i < methods.length; i++){ System.out.println(methods[i].getName()); }执行结果如下:
通过调用getMethods()方法,可以获取Person类中的所有方法,包括父类中的方法,如下面的代码:
public class Test { public static void main(String[] args) throws Exception{ Method[] methods = Person.class.getMethods(); for(int i = 0; i < methods.length; i++){ System.out.println(methods[i].getName()); } } }执行结果为:
类似的,我们可以通过反射机制得到Person类中的字段,有两个方法:getFields()和getDeclaredFields(),具体使用就不详细说明
另外,反射机制中还可以获取类的构造方法,使用getConstructors() 或 getDeclaredConstructors(),下面把这三对方法总结如下:
*getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法
*getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关
通过获取类中的方法,我们可以调用这些方法,主要使用invoke来实现对方法的调用,如下面的代码:
package cn.yubo.test; import java.lang.reflect.Method; public class Test { public static void main(String[] args) throws Exception { Class<?> personCls = Class.forName("cn.yubo.test.Person"); Person p = new Person(); Method setNameMethod = personCls.getDeclaredMethod("setName", String.class); //① setNameMethod.invoke(p, "yubo"); <span style="white-space:pre"> </span> //② System.out.println("name = " + p.getName()); } }在上面的代码中,①主要是得到一个方法,第一个参数"setName"是方法的名称,第二个参数"String.class"是方法setName中需要传进的参数的类型,如果setName方法有多个参数,那么getDeclaredMethod方法后就跟上多个***.class,②主要是调用方法,其中第一个参数p是该方法所在的对象,第二个参数是需要传递的参数,由于我们是通过反射调用的Person的setName方法,所以代码②就相当于调用的setName("yubo");最后,我们调用Person类的getName方法,验证是否成功调用了setName,在控制台打印的结果如下:
相关文章推荐