您的位置:首页 > 编程语言 > Java开发

Java的反射机制

2014-09-29 16:57 513 查看
使用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,在控制台打印的结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: