java中的反射以及一个小问题
2009-12-16 21:42
441 查看
反射是一个很有用的东西,特别在三大框架里面,用的都是反射。
下面就举一个例子吧:
一个Computer的类
如果将它反射出来呢?比如我想用这个类里面的一个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);
为了清晰,我再将整个代码贴上:
照理说应该出来结果:电脑的名字:xiao有15台。。。
但事实上却报了一个错:
刚开始百思不得其解,我把show方法里面的参数类型变为String,在Test类里面Method method=c.getMethod("show", String.class);
程序运行,没报错,出来了我要的结果。
大概想了一下,把show里面的参数类型改为Integer,再运行,没问题。。
也就是说反射的话,方法里面的参数类型必须是Object类型,如果是基本类型的话,必须是它的包装类,这里MS它不会给自动加包!
下面就举一个例子吧:
一个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它不会给自动加包!
相关文章推荐
- java学习笔记---第一个applet程序以及一个小问题的解决
- 由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
- Java的安全检查以及反射的性能问题
- 用java写关于删除一个字符串的字符以及删除一个字符串与另一个字符串中相同字符的问题
- java调用linux top命令的方法,以及遇到的一个问题
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
- java JsonObject的用法以及map总同一个key,但是不同的value,如何存储的问题
- Java中一个运用反射解决问题例子+思考
- Java反射的一个小问题
- java中的重写问题,以及一个对象的实例化过程
- java中TreeMap自定义排序以及一个键对应多个值问题
- solr中一个问题——顺便讨论java中关于中包括main函数以及涉及资源(变量)操作中的类
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(1)
- 黑马程序员——java中两个线程对同一个数据做不同操作的安全问题
- Java代码规范--排版,命名---以及一个例子
- 一个java简单问题
- 对java中的String采用+=连接字符串需要注意的一个问题
- 有关于在Java 类的静态初始化块中创建一个自身实例的问题。
- [Java面试五]Spring总结以及在面试中的一些问题.