黑马程序员技术交流社区

标题: 代码中有的地方看不懂啊 [打印本页]

作者: crazy_primitive    时间: 2013-7-14 10:35
标题: 代码中有的地方看不懂啊
本帖最后由 杨兴庭 于 2013-7-15 17:50 编辑

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;

  4. public class ReflectTest {
  5.         public static void main(String[] args)throws Exception {
  6.                 String str = "abcde";
  7.                 Constructor constructor = String.class.getConstructor(StringBuffer.class);
  8.                 String str2 = (String)constructor.newInstance(new StringBuffer("abcdef"));
  9.                 System.out.println(str.charAt(3));
  10.                 ReflectPoint rp1 = new ReflectPoint(7,8);
  11.                 Field fieldy = rp1.getClass().getField("y");
  12.                 System.out.println(fieldy.get(rp1));
  13.                 Field fieldx = rp1.getClass().getDeclaredField("x");
  14.                 fieldx.setAccessible(true);
  15.                 System.out.println(fieldx.get(rp1));        
  16.                 changeStringValue(rp1);
  17.                 System.out.println(rp1);
  18.                
  19.                 Method methodCharAt = String.class.getMethod("charAt",int.class);
  20.                 System.out.println(methodCharAt.invoke(str, 1));

  21.                 System.out.println(methodCharAt.invoke(str, new Object[]{3}));
  22.                 String startClassName = args[0];
  23. //这里老是报错,可是明明是按照张孝祥老师的代码写的啊,而且怎么检查都没看出哪里错了
  24.                 Method mainMethod = Class.forName(startClassName).getMethod("main",String[].class);
  25.                 mainMethod.invoke(null,(Object)new String[]{"dsa","xzvdd","13124"});
  26.                 mainMethod.invoke(null,new Object[]{new String[]{"dsa","xzvdd","13124"}});
  27.         }
  28.         public static void changeStringValue(Object obj) throws Exception{
  29.                 Field[] fields = obj.getClass().getFields();
  30.                 for(Field field : fields){
  31.                         if(field.getType() == String.class){
  32.                                 String oldvalue = (String)field.get(obj);
  33.                                 String newvalue = oldvalue.replace('b', 'a');
  34.                                 field.set(obj, newvalue);//这里是将新的字符串重新赋给obj吗?
  35.                         }
  36.                 }
  37.         }
  38. }

  39. class TestArguments{
  40.         public static void main(String[] args){
  41.                 for(String arg : args){
  42.                         System.out.println(arg);
  43.                 }
  44.         }
  45. }
  46. public class ReflectPoint {
  47.         public String str1 = "baeioahi";
  48.         public String str2 = "bjoabjaboaiaobbbba";
  49.         public String str3 = "rwqwrqwqw";
  50.         @Override
  51.         public String toString() {
  52.                 return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3=" + str3 + "]";
  53.         }
  54. }
复制代码

作者: 王靖远    时间: 2013-7-14 10:53
startClassName怎么没看到这个类的出现?还有主函数传值了吗
作者: changweihua    时间: 2013-7-14 13:48
startClassName是不是写起始类,也就是你下面的TestArguments这个类呢?
作者: 白堇翎    时间: 2013-7-14 14:05
本帖最后由 白堇翎 于 2013-7-14 15:37 编辑

你的代码本身没有问题, 是运行的时候需要加上一行格外的参数 这个视频里面有讲到的你可以把他想象成你这些代码运行本身需要2个主函数,而你运行的时候只运行了其中的1个,另外一个也需要运行..看我的图你就明白了

另外我把你的代码copy到记事本上 在dos中加上参数重新运行了一遍 没有任何问题

另外版主求分...我现在很需要分




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