黑马程序员技术交流社区

标题: 运行时错误 [打印本页]

作者: 余宏    时间: 2012-5-22 16:59
标题: 运行时错误
import java.lang.reflect.Field;
public class TestMain {

       
        public void setName(Object obj, String name, Object o){
                try {
                        Field f = obj.getClass().getDeclaredField(name);
                        f = obj.getClass().getDeclaredField(name);
                        System.out.println(f);
                        f.setAccessible(true);
                        try {
                                f.set(obj,o);
                        } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        } catch (IllegalAccessException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchFieldException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
        public static void main(String[] args) {
                TestMain c = new TestMain();
                        c.setName(c,"TestMain.java", c);
                        System.out.println(c);
        }

}
这段代码编译没有错,但是运行就会报一下错误,什么原因呢?
java.lang.NoSuchFieldException: TestMain.java
        at java.lang.Class.getDeclaredField(Class.java:1882)
        at com.itcast.test.TestMain.setName(TestMain.java:9)
        at com.itcast.test.TestMain.main(TestMain.java:33)
com.itcast.test.TestMain@150bd4d

作者: 张晨    时间: 2012-5-22 17:21
本帖最后由 张晨 于 2012-5-22 17:41 编辑

Field f = obj.getClass().getDeclaredField(name);
是拿一个名字叫TestMain.java 的域,那肯定是没有的,因为你的类里面没有域
  1. package info.dyndns.oszc.puzzle1;

  2. import java.lang.reflect.Field;

  3. public class Puzzle1 {

  4.         /**
  5.          * @param args
  6.          *
  7.          */
  8.         public String TestMainjava="hhh";
  9.         public void setName(Object obj, String name, String o) {
  10.                 try {
  11.                         Field f = obj.getClass().getDeclaredField(name);
  12.                         f = obj.getClass().getDeclaredField(name);
  13.                         System.out.println(f);
  14.                         f.setAccessible(true);
  15.                         try {
  16.                                 f.set(obj, o);
  17.                         } catch (Exception e) {
  18.                                 // TODO Auto-generated catch block
  19.                                 e.printStackTrace();
  20.                         }
  21.                 } catch (Exception e) {
  22.                         // TODO Auto-generated catch block
  23.                         e.printStackTrace();
  24.                 }

  25.         }
  26.         
  27.         public static void main(String[] args) {

  28.                 Puzzle1 p1 = new Puzzle1();
  29.                 p1.setName(p1, "TestMainjava", "hh");
  30.                 System.out.println(p1.TestMainjava);
  31.         }

  32. }

  33. ~~output~~~

  34. public java.lang.String info.dyndns.oszc.puzzle1.Puzzle1.TestMainjava
  35. hh
复制代码

作者: 余宏    时间: 2012-5-22 19:36
本帖最后由 余宏 于 2012-5-22 19:38 编辑
张晨 发表于 2012-5-22 17:21
Field f = obj.getClass().getDeclaredField(name);
是拿一个名字叫TestMain.java 的域,那肯定是没有的, ...

我试了下,可以了,谢谢




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