黑马程序员技术交流社区

标题: <已解决>基础加强中反射这的,有个错误,可是改了半天也... [打印本页]

作者: 贾飞雨    时间: 2012-8-12 21:22
标题: <已解决>基础加强中反射这的,有个错误,可是改了半天也...
本帖最后由 贾飞雨 于 2012-8-12 22:29 编辑

public class ReflectTest {

        /**
         * @param args
         * @throws ClassNotFoundException
         * @throws NoSuchMethodException
         * @throws SecurityException
         */
        public static void main(String[] args) throws Exception{
                // TODO Auto-generated method stub
                String str1 = "aba";
                Class cls1 = str1.getClass();
                Class cls2 = String.class;
                Class cls3 = Class.forName("java.lang.String");
                System.out.println(cls1==cls2);
                System.out.println(cls2==cls3);
               
                System.out.println(cls1.isPrimitive());
                System.out.println(int.class.isPrimitive());
                System.out.println(int.class == Integer.class);
                System.out.println(int.class == Integer.TYPE);
                System.out.println(int[].class.isPrimitive());
                System.out.println(int[].class.isPrimitive());
               
                //new String(new StringBuffer("abc"));
                Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
                String str2 = (String)constructor1.newInstance(StringBuffer.class);
                System.out.println(str2.charAt(1));
                ReflctPoint pt1 = new ReflctPoint(3, 5);
                Field fieldY = pt1.getClass().getField("Y");
                System.out.println(fieldY.get(pt1));
                //getChangeString(pt1);
                System.out.println(pt1);
                }
}
错误显示的是32行,也就是红色字那里,下面是错误提示,大家帮我看一下,明明和张老师的一样啊,

true
true
false
true
false
true
false
false
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
        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 shiyi.ReflectTest.main(ReflectTest.java:32)






作者: 陈潼    时间: 2012-8-12 21:35
应该传参数new StringBuffer("XXX")而不是StringBuffer.class   
作者: 贾飞雨    时间: 2012-8-12 21:42
陈潼 发表于 2012-8-12 21:35
应该传参数new StringBuffer("XXX")而不是StringBuffer.class

为什么要new StringBuffer呢,不可以直接传

作者: 郑小杰    时间: 2012-8-12 22:02
  Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
   String str2 = (String)constructor1.newInstance(new StringBuffer("XXX"));
第一行代码的目的是创建构造方法,不过String的构造方法有很多,所以要用StringBuffer.class来说明这个构造方法里面的参数是StringBuffer类型的
第二行代码的目的是创建字符串对象,那么就需要传参数了,把一个StringBuffer的对象传进来就OK了
作者: 郑正华    时间: 2012-8-12 22:10
本帖最后由 郑正华 于 2012-8-13 11:03 编辑

//new String(new StringBuffer("abc"));张老师是想用反射方式来实现这行代码;
这行代码的意思是用一个StringBuffer对象传递给String的构造方法,然后再用这个构造方法new出一个String的对象;

Constructor constructor1 = String.class.getConstructor(StringBuffer.class);//得到一个构造方法的字节码,并且选择了这个构造方法的参数类型是StringBuffer,
String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));//用这个构造方法实例化了一个对象,这个对象是StringBuffer类new出来的一个对象,这里的StringBuffer既new了一个对象,还往对象传了个值。

不是说非要new StringBuffer("abc")这么写,张老师这么写就是想要用反射方式来实现这行代码:new String(new StringBuffer("abc"));

楼主明白吗?
作者: 贾飞雨    时间: 2012-8-12 22:29
嗯,谢谢
作者: 郑正华    时间: 2012-8-13 10:17
贾飞雨 发表于 2012-8-12 22:29
嗯,谢谢

客气..{:2_31:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2