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

Java反射之Method调用和Filed设置

2010-01-24 14:13 459 查看
反射是java的一个高级特性。

Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现之interfaces(例如Serializable),也包括fields和methods 的所有信息,并可于运行时改变fields内容或调用methods。

反射就是给应用程序一个可以检查自己和运行环境的一个路径。自己信息的替代—MetaData.

入门级别先看看如果通过反射调用方法和设置成员变量的值:

1.通过反射设置变量值

import java.lang.reflect.Field;
/**
* 反射修改Field
*
* @author yblin
*/
public class RefField {
public String color;
public Double number;
public static void main(String args[]) {
try {
Class c = RefField.class;
Field colorField;
colorField = c.getField("color");
Field numberField = c.getField("number");
RefField obj = new RefField();
colorField.set(obj, "blue");
System.out.println("color=" + colorField.get(obj));
numberField.set(obj, 2.1);
System.out.println("number=" + numberField.get(obj));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


2.调用反射调用方法

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射方法调用。
*
* @author yblin
*/
public class RefMethod {
private String color;
public void printColor() {
System.out.println("color is:" + color);
}
public RefMethod(String color) {
this.color = color;
}
public void sayHello(String name, Integer age) {
System.out.println("Hello world," + name + "!" + "The age is:" + age);
}
public static void main(String args[]) {
Class cls = RefMethod.class;
RefMethod ref = new RefMethod("blue");
try {
Method sayHello = cls
.getMethod("sayHello", new Class[] { String.class, Integer.class });//寻找具有String参数和Integer参数的sayHello方法。
Method printColor = cls.getMethod("printColor", null);
try {
sayHello.invoke(ref, new Object[] { "ant", 3 });//通过Mechod对象的invoke调用来调用方法
printColor.invoke(ref, null);
} catch (IllegalArgumentException e) {//无效参数
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {//无权访问
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: