reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它,下面的例子可以说明这一点:
import java.lang.reflect.*;
public class field2 {
   public double d;
   public static void main(String args[]) {
       try {
           Class cls = Class.forName("field2");
           Field fld = cls.getField("d");
           field2 f2obj = new field2();
           System.out.println("d = " + f2obj.d);
           fld.setDouble(f2obj, 12.34);
           System.out.println("d = " + f2obj.d);
       } catch (Throwable e) {
           System.err.println(e);
       }
   }
}
这个不知有什么好处,不用它我也能把对象数据字段的值改变了啊,刚接触反射,请大家指点。

解决方案 »

  1.   

    反射通常结合工厂模式使用比如spring的ioc
      

  2.   

    反射是让Java成为准动态语言的特性。
    比如你可以在完全不知到是什么类的情况下,给这个类的某个字段赋值。
      

  3.   

    又比如JavaBean有很多get,set方法,但你不知到JavaBean的类名是什么
    (事实上有很多类有get,set方法)。
    而你要把这个不知到是什么类的类生成对象并注入数据。
    只要传入个类名,反射出"set"开头的方法invoke就行了。
    那这样就对任何有get,set的方法的类都有用了。
      

  4.   

    有的情况下,你只知道一个字符串变量是类全名,具体是哪个类你不能确定,这个时候就要用到反射了。
    Spring struts 等很多xml文件里面配置的类全名,都是用反射来创建对象的。
      

  5.   

    Class对象有instance()方法可以产生实例。
      

  6.   

    mySingleLive 能举个例子吗?网上也是这么说的
      

  7.   

    <bean id="abc" class="com.abc.impl.DefaultDAOQueryPO">
    </bean>这是常见的spirng配置文件,我们配置了这个,spring就能创建这个类的对象,实际上就是通过反射来创建的。很多xml里面配置的类全名,都是通过反射的方式创建对象的。Class cla=Class.forName("reflect.Student");
    Class[] paraTypes =new Class[]{int.class,String.class,String.class,String.class};
    Constructor contructor=cla.getConstructor(paraTypes);
    Object[] objs=new Object[]{32,"姚明","上海市","13888888888"};
    Student stu=(Student)contructor.newInstance(objs);
    System.out.println(stu.jok(stu));
      

  8.   

    public static Object getInstance(String clsname) { 
          try { 
              Class cls = Class.forName(clsname); 
              Object intance = cls.instance();
              Method[] ms = cls.getMethods();
              for(int i=0;i<ms.length;i++) {
                   String mname = ms[i].getName();
                   if(mname.starwith("set")) {
                        ms[i].invoke(intance,/*数据*/);
                   }
              }
              return instance;
          } catch (Exception e) { 
              System.err.println(e); 
          } 
      } 
      

  9.   

    哈哈,谢谢你们啦,我想问一下mySingleLive,你说的带Invoke方法的回答是以前在什么框架里用过(比如spring什么的)或在什么项目里用过吗?
      

  10.   

    接上面public static void main(String[] args) {
          User user = (User)getInstance("User");
          Admin admin = (Admin)getInstance("Admin");
          Teacher theacher = (Teacher)getInstance("Theacher");
          ....
          //可以类名取得对象,而且是有数据的(数据可以是来自数据库)。
    }
      

  11.   

    Spring,Hibernate等框架都用过这种模式。
      

  12.   

    那你说的invoke在那里见过呢?
      

  13.   

    反射其实是很厉害的,还有个ClassLoarder更厉害,
    它运行时动态地加载类,甚至是通过网络来加载一个类。
    用的好的话几乎是无所不能,哈哈,扯远了。
      

  14.   

    invoke是Method的一个方法,用它来执行调用方法。