Java的反射机制

来源:互联网 发布:js select 设置选中项 编辑:程序博客网 时间:2024/06/02 13:23

使用Java的反射机制获取类的对象,有如下几种方法:

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,在控制台打印的结果如下:






0 0
原创粉丝点击