java包装类报错反射,为什么报错呢?

博客分类:
时光如梭,转眼间到了2011年,新的一年,新的开始,希望同学们在这一年里有更大的收获. 我们开始了今年的第一个班级授课任务
,这几天都忙于给学员加强java基础.
在忙于授课的同时,把今天学员遇到的第一个关于反射的bug:java.lang.IllegalArgumentException: wrong number of
arguments的问题解析如下:
1、错误bug
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at cn.csdn.reflect.StudentTest.test4(StudentTest.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
异常引起的原因分析:
引起错误的原码:
public Student(String strs[]){
System.out.println(strs.length);
执行代码:
//解析:public cn.csdn.reflect.Student(java.lang.String[])
public void test4()throws Exception{
//1、加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
//2、根据构造器参数类型获取相应的构造器对象
Constructor csr = cls.getConstructor(String[].class);
//3、创建实体对象
Student entity = (Student)csr.newInstance(new String[]{});
//4、调用方法
entity.study();
编译环境:jdk1.6
错误分析:由于Student(String strs[])构造器只有一个String数组的参数所以这是编译器会把字符串数组当作一个可变长度参数传
给对象strs,而我们取得方法只有一个参数,所以就会出现wrong number of arguments的异常,我们只要把字符串数组强制转换为一
个Object对象就可以解决这个异常了,
解决方案:
//解析:public cn.csdn.reflect.Student(java.lang.String[])
public void test4()throws Exception{
//1、加载类
Class cls = Class.forName("cn.csdn.reflect.Student");
//2、根据构造器参数类型获取相应的构造器对象
Constructor csr = cls.getConstructor(String[].class);
String str[]={"111","123"};
//3、创建实体对象
Student entity = (Student)csr.newInstance((Object)str);
//4、调用方法
entity.study();
浏览 33232
RedArmyChen
浏览: 308977 次
来自: 北京
虽然简单,但也明了,辛苦了
前台页面没有啊
读取页面,用字节流,再把字节数据转成特定编码字符,还是字节流好 ...
整合到一个参数 也报错,也没解决问题
public Bao ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'反射出错java.lang.IllegalArgumentException: argument type mismatch
[问题点数:20分]
本版专家分:0
CSDN今日推荐
本版专家分:37619
2009年11月 Java大版内专家分月排行榜第一
2010年2月 Java大版内专家分月排行榜第二
2011年7月 Java大版内专家分月排行榜第三2010年1月 Java大版内专家分月排行榜第三2009年12月 Java大版内专家分月排行榜第三
本版专家分:10515
本版专家分:1267
本版专家分:0
本版专家分:1895
匿名用户不能发表回复!|
其他相关推荐java中既然有封装,为什么要有个反射?这不是自己打自己嘴巴嘛,
<a data-traceid="question_detail_above_text_l&&
java中既然有封装,为什么要有个反射?这不是自己打自己嘴巴嘛,封装就是为了把一些相关的属性和行为隐藏起来,搞个反射不就没有意义了嘛?求解为什么sun 公司这么做?目的何在?作用又何在?
反射就是用来解决OO中遇到的问题,解决获知内部状态困难的问题。一般来说,只要是面向对象的语言都有反射(即我所知,只有C++例外,没有在语法上提供,这个和C+=更接近底层有关)
每种语言和设计模式都有自己的不足,如果这叫打脸的话,那全世界的语言的脸都被你打肿了。
不能手里有锤子,就看到什么都是钉子,工具只是让你多了一个选择
反射可以根据类名称动态生成对象,struts1 中的action用反射动态生成, tomcat根据web.xml中的配置用反射动态生成servlet对象,java的Proxy用反射生成被代理的类对象。。。
封装就不是为了把一些相关的属性和行为隐藏起来。封装只是把某类数据和逻辑组织到一起。而通过反射可以清楚的知道这些组织方式。
就像真实世界一样,我们需要把一些东西包装起来,给那些不用知道其内部结构的人用,这叫封装。而有时候又需要把一个东西的内部呈现出来,了解其构造,然后制造出相同的东西,这叫反射。&
框架是基于反射的,没反射也就没有所谓的框架了。那样的话开发多单调
请看官方文档:&
Extensibility Features
An application may make use of external, user-defined classes by creating instances of extensibility objects using their fully-qualified names.
Class Browsers and Visual Development Environments
A class browser needs to be able to enumerate the members of classes. Visual development environments can benefit from making use of type information available in reflection to aid the developer in writing correct code.
Debuggers and Test Tools
Debuggers need to be able to examine private members on classes. Test harnesses can make use of reflection to systematically call a discoverable set APIs defined on a class, to insure a high level of code coverage in a test suite.
反射给我们提供了灵活性(通用性),但是影响性能。spring就是反射应用的一个例子。
例如,导出excel。这样一个基本的功能就可以用到反射。利用反射可以将写入excel部分和其他代码逻辑分离开。降低耦合,代码复用等等其他好处。
问这个问题,说明接触java时间还不多。
反射是为了能在运行时得到类、方法、属性等的信息。假设没有反射,Spring如何根据配置文件来做IoC,如何获取Annotation。这和封装有什么矛盾反射到底能干啥?【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:722,495贴子:
反射到底能干啥?收藏
当时看的时候就没弄懂,今天回过头来重新看还是不太明白,知道怎么用了,但是不知道什么时候用.课程中具体说eclipse类的对象
一下就可以看到这个类的属性和方法,但是除了这个不知道到底哪儿能用到了
前面我也觉得没啥用 不过 有的时候 还必须得用这个 现在很多框架都是基于 反射的
等学框架就明白了
比如你想自己写个持久层框架。。。觉得resultset 每次一个个去手动赋值太麻烦了。。。这时候你就用反射。封装成一个方法。OK,这就是ibatis
嗯... 比如你写个log4j类 或者日志拦截器 每个servlet都走这个拦截器 你这个日志拦截器需要适配任何对象 而你又不想写很复杂很复杂的代码来实现 这时候反射机制就能起作用了反射本质上就是在编译的时候 不需要知道具体的类 在运行的时候 才知道是哪个类 并且能调用该类的方法另外楼上说的都对 等你学框架你就懂了
设计框架。。。
反射发生在运行时,主要的像框架。
通过对象名获取对象?
一、什么是反射机制
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,
那么就可以通过反射机制来获得类的所有信息。二、哪里用到反射机制
有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,
Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成
驱动对象实例,并不知道它的具体含义。听了反射机制这节课后,才知道,原来这就是反射,现在很多开
框架都用到反射机制,hibernate、struts都是用反射机制实现的。三、反射机制的优点与缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多
态的应用,有以降低类之间的藕合性。
一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中
它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编
译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如
这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能
的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功
它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它
满足我们的要求。这类操作总是慢于只直接执行相同的操作。四、利用反射机制能获得什么信息
一句话,类中有什么信息,它就可以获得什么信息,不过前提是得知道类的名字,要不就没有后文了
首先得根据传入的类的全名来创建Class对象。
Class c=Class.forName("className");注明:className必须为全名,也就是得包含包名,比如,cn.netjava.pojo.UserI
Object obj=c.newInstance();//创建对象的实例
OK,有了对象就什么都好办了,想要什么信息就有什么信息了。
获得构造函数的方法
Constructor getConstructor(Class[] params)//根据指定参数获得public构造器
Constructor[] getConstructors()//获得public的所有构造器
Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器
Constructor[] getDeclaredConstructors()//获得public的所有构造器
获得类方法的方法
Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法
Method[] getMethods()//获得所有的public方法
Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法
Method[] getDeclaredMethods()//获得所以的public和非public方法
获得类中属性的方法
Field getField(String name)//根据变量名得到相应的public变量
Field[] getFields()//获得类中所以public的方法
Field getDeclaredField(String name)//根据方法名获得public和非public变量
Field[] getDeclaredFields()//获得类中所有的public和非public方法
常用的就这些,知道这些,其他的都好办……五、用反射机制能干什么事
刚开始在使用jdbc时侯,在编写访问数据库时写到想吐,有八个表,每个表都有增删改查中操作
那时候还不知道有反射机制这个概念,所以就对不同的表创建不同的dao类,这样不仅开发速率地,而且代码
冗余的厉害,最要命的是看着差不多的,然后直接复制修改,由于容易犯各种低级的错误(大小写啊,多一
个或少一个字母啊……),一个错误就可以让你找半天。
有了java反射机制,什么都好办了,只需要写一个dao类,四个方法,增删改查,传入不同的对象,就OK啦,无需为每一个表都创建dao类,反射机制会自动帮我们完成剩下的事情,这就是它的好处。说白了,反射机制就是专门帮我们做那些重复的有规则的事情,所以现在很多的自动生成代码的软件就是运用反射机制来完成的,只要你按照规则输入相关的参数,所以低级的程序员慢慢的就被抹杀了,为什么?因为代码都不用写了,随便一个人都会开发,还要程序员干什么啊?所以我们只有一条出路,那就是努力努力再努力,成为高级程序员,专门开发傻瓜软件,让其他程序员
到 一边凉快去,呵呵~
反射称之为反射机制,什么是机制,就是一些东西的根本性原理,等学到后面就发现作用了
很多框架上都用了,android framework也用了。
hibernate 用反射获得对象,封装解析对象存数据库.spring 依赖注入,注入对象时就用的是反射.
五花八门的回答,我都眼花了。简单地说就是你想new一个对象,调一个方法,但是你还不确定要new哪个对象,调哪个方法,要程序跑起来再看情况而定,你就不能提前在程序里写好常规的方法代码。等到程序跑起来以后,获得类名和方法名了,但是是String型的,你要让这个类的对象中的方法能运行,就要进行反射。
@dtph007帮我发个广告,亲
想自己做框架,不做反射,不行。作用就是吧字符串转换成对象。
如果都是做些简单的逻辑,那么反射机制几乎是没用到的。顺便最近做东西我都是用的内省(这个实际上和反射差不多)
发现上面的代码其实有点多余的地方,比如:bean=beanClass.newInstance();//Class c=bean.getClass();BeanInfo info=Introspector.getBeanInfo(beanClass, beanClass.getSuperclass());这里应该直接用beanClass了
&bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&&property name="dataSource" ref="dataSource" /&&property name="hibernateProperties"&&props&&prop key="hibernate.dialect"&org.hibernate.dialect.Oracle10gDialect&/prop&&prop key="hibernate.show_sql"&true&/prop&&prop key="hibernate.format_sql"&false&/prop&&prop key="hibernate.cache.use_second_level_cache"&true&/prop&&prop key="hibernate.cache.provider_class"&org.hibernate.cache.EhCacheProvider&/prop&&!--&prop key="hibernate.cache.use_query_cache"&true&/prop& &prop key="hibernate.cache.use_second_level_cache"&true&/prop& &prop key="hibernate.cache.provider_class"&org.hibernate.cache.EhCacheProvider&/prop& &prop key="hibernate.hbm2ddl.auto"&${hibernate.hbm2ddl.auto}&/prop& --&&/props&&/property&&property name="mappingLocations"&&list&&value&classpath:com/lxx/entity/*.hbm.xml&/value&&/list&&/property&&!-- 自动扫描hbm方式配置的hibernate文件和.hbm文件 --&&!-- &property name="mappingDirectoryLocations"& &list& &value&classpath:sy/hbm&/value& &/list& &/property& --&&/bean&
最简单的用处 我有很多个对象 每个都不一样 我需要将他们拼接成我要的标准绘图串 不管什么对象 构造有什么区别 我直接反射属性名和属性值进行我要的操作 一个方法适配所有类 没反射你要为每一个类去写一个方法 因为每个类里面的属性名都不一样 不知道属性名就没法写 但有了反射 你一个属性名都不需要知道
我只想问楼主懂了反射是啥了吗?没懂我再说一句.反射就是用Class.forName(&java文件&)获得一个Class类.比较爽的地方:你可以自己生成开始运行时还不存在的新类来实例化使用!其他什么获得属性,一个方法匹配所有类中的各种字段都是同样道理.
当运行时才知道要创建哪个类的实例时用
假如有两个类,teacher和student,两个类中都有个setName(String name)方法。现在你有一个封装的方法TestMethod,这个方法里可能需要传参数teacher或者student。这时候你可以传个teacher.getClass()或者student.getClass()进去,然后通过反射执行setName方法。
登录百度帐号博客分类:
* @author jsczxy2
public class TestCaseThread implements Runnable, Serializable {
private static final long serialVersionUID = -9499860L;
Log log = LogFactory.getLog(getClass());
private String classN
public TestCaseThread(String className) {
this.className = classN
@SuppressWarnings("unchecked")
public void run() {
Class c = Class.forName(className);
Method method = c.getMethod("main", String[].class);
SysDwr.testFlag.setCheck(false);
method.invoke(null, (Object) new String[] {});
SysDwr.testFlag.setCheck(true);
} catch (Exception e) {
SysDwr.testFlag.setCheck(true);
SysDwr.testFlag.setErrorMsg(handleException(e));
private String handleException(Exception e) {
String msg =
if (e instanceof InvocationTargetException) {
Throwable targetEx = ((InvocationTargetException) e)
.getTargetException();
if (targetEx != null) {
msg = targetEx.getMessage();
msg = e.getMessage();
handleException方法用来捕捉反射调用类报出的错误,与一般直接取方法的错误是不一样的,反射类调用方法中抛出的Exception会以InvocationTargetException抛出到上层业务中,必须单独处理。
浏览: 858139 次
来自: 常州
然后是相关配置:/etc/sysconfig/iptables ...
我测试没啥区别啊!
renzhengzhi 写道drager 写道用jsoup后解 ...
感觉不对啊,通过实现Runnable接口来实现的线程里,使用T ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 java工程报错改为提醒 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信