因为工作需要,所以看了动态装载类和方法的内容
实际上看懂的话都很容易的。
以下是个例子,用来说明一下。
====================
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,
则发生编译无法匹配的错误。
Showing posts with label 反射 动态装载 java. Show all posts
Showing posts with label 反射 动态装载 java. Show all posts
Tuesday, June 5, 2007
Subscribe to:
Posts (Atom)