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

java中的反射以及一个小问题

2009-12-16 21:42 441 查看
反射是一个很有用的东西,特别在三大框架里面,用的都是反射。

下面就举一个例子吧:

一个Computer的类

package rtti;
public class Computer {
private String name;
public Computer(String name){
this.name=name;
}
public void show(int i){
System.out.println("电脑的名字:"+name+"有"+i+"台");
}
}


如果将它反射出来呢?比如我想用这个类里面的一个show方法,但不想把Computer给new出来。。

首先是要得到那一个类:

Class c=Class.forName("rtti.Computer");

后面的路径必须是:包名+"."+"类名",而不是包名/类名,也不用src,在IO里面是要用到src的,反射里面不用。

接下来是重要的一步,因为Computer类的构造函数有一个String的参数,并不是无参的,如果是无参的,那么好解决,代码如下:

Object o=c.newInstance();//显然的,o的类型已经是Computer的类型,也就是说o是computer的实例了。

但是因为有参数,所以不能这样实例化,必须通过构造器,代码如下:

Constructor con=c.getConstructor(String.class);

Object o=con.newInstance("xiaoyi");

如果要反射方法的话,只需要通过c来得到method,再用method里面的invoke()方法即可,代码如下:

Method method=c.getMethod("show", Integer.class);

method.invoke(o, 15);

为了清晰,我再将整个代码贴上:

package rtti;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
Class c=Class.forName("rtti.Computer");
Constructor con=c.getConstructor(String.class);
Object o=con.newInstance("xiaoyi");
Method method=c.getMethod("show", Integer.class);
method.invoke(o, 15);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}


照理说应该出来结果:电脑的名字:xiao有15台。。。

但事实上却报了一个错:

java.lang.NoSuchMethodException: rtti.Computer.show(java.lang.Integer)
at java.lang.Class.getMethod(Class.java:1581)
at rtti.Test.main(Test.java:13)


刚开始百思不得其解,我把show方法里面的参数类型变为String,在Test类里面Method method=c.getMethod("show", String.class);

程序运行,没报错,出来了我要的结果。

大概想了一下,把show里面的参数类型改为Integer,再运行,没问题。。

也就是说反射的话,方法里面的参数类型必须是Object类型,如果是基本类型的话,必须是它的包装类,这里MS它不会给自动加包!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐