Tuesday, June 5, 2007

动态装载类和相应的方法

因为工作需要,所以看了动态装载类和方法的内容
实际上看懂的话都很容易的。

以下是个例子,用来说明一下。
====================
import java.lang.reflect.*;

public class TestMethod {

public static void main(String[] args) {

try {
//动态装载类,forName中为类名。
Class classTest = Class.forName("TestMethod");
//初始化一个一个对象,并把他赋给object
Object object = classTest.newInstance();

//传递的参数,需要和调用的函数的参数顺序一致,而且类型要统一
Class[] cArgs = new Class[3];

//测试数据
String string = "test";
Integer integerNum = 123;
Float floatNum = 123.1f;

//以下是数据的数据类型
cArgs[0] = string.getClass();
cArgs[1] = integerNum.getClass();
cArgs[2] = floatNum.getClass();

//以下是数据装载。
Object[] inArgs = new Object[3];
inArgs[0] = string;
inArgs[1] = integerNum;
inArgs[2] = floatNum;

//调用了method方法,返回值为Method变量,这里仅仅是传递方法名,还有方法调用时的参数类型。
Method method = classTest.getMethod("method", cArgs);

//直接调用该方法。因为invoke中两个对象都是Object,所以需要设置下。第一个参数需要是一个实例的引用,第二个参数才是真正的数据。
method.invoke(object, inArgs);
} catch (Exception e) {
System.out.println(e);
}

}

public void method(String string, Integer integerNum, Float floatNum) {
System.out.println("String:"+string);
System.out.println("Integer:"+integerNum);
System.out.println("Float:"+floatNum);
}
}
====================

看到没有?java的反射机制真的很不错,这样子就可以动态的装载类还有类的方法。
切记,数据类型中不要使用int和float这样子的基础类型,因为没有getClass这个函数。
当然调用的时候可以用,但是至于函数声明时必须是类,不可以是基础类型。
例如你调用的时候把int数值赋给intergerNum对应的参数。但是函数声明中不可以是:
method(String string, int integerNum, Float floatNum)
注意到没有,因为即使你传递int数值给函数调用,但是还是被自动转换为Integer的实例了
但是函数调用的时候,int因为没有getClass的函数,如果你传递Integer,
则发生编译无法匹配的错误。

No comments: