A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余宏 中级黑马   /  2012-5-22 16:59  /  2129 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 张晨 于 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
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 余宏 于 2012-5-22 19:38 编辑
张晨 发表于 2012-5-22 17:21
Field f = obj.getClass().getDeclaredField(name);
是拿一个名字叫TestMain.java 的域,那肯定是没有的, ...

我试了下,可以了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马