由于设计需要看拉些java反射的知识点,有几个问题没有理解:
1。反射用来动态的检查对象和修改其字段调用方法,但是一个类A只有一个Class对象与其对应,那么当A有10个对象,怎么知道更改的是那个
2。UI设计中反射应用是否意味着MVC的各类中不需要在设置相互的对象引用,比如,View的对象中要设置M的对象,用来访问M的属性
哪位朋友知道的,请解答下(希望能阐述下反射的理解和应用范围),谢谢,感激不仅

解决方案 »

  1.   

    你若用反射更改某对象,是需要把此对象实例传进去的,楼主试过没?在实践中自然有答案。这是我以前写的一个方法,这个参数MyForm是个抽象类,它有很多子类,我需要调用从数据库中取出数据,调用该子类的所有set方法,把属性值设进去,如果MyForm有8个子类,我们要写八个这样的方法,因为每个子类的set方法数和名称,参数列表明显是不一样的,如果用反射,我们只用写一个方法就行了,注意,虽然参数列表是MyForm,但是调用时传进的参数都是具体MyForm的子类,那么Class c如果你打出它的name的话,会发现不是MyForm,而是正确的子类,这就好处理了撒~~哪不懂再回帖问public static MyForm getForm(ResultSet rs, MyForm myForm) {
            Class c = myForm.getClass();
            Field[] fields = c.getDeclaredFields();//得到此类所有的字段
            Method method = null;
            for (int i = 0; i < fields.length; i++) {
                String tempField = fields[i].getName();
                String tempMethod = "set" + tempField.substring(0, 1).toUpperCase() +
                                    tempField.substring(1);//根据字段名拼凑其set方法名
                Class cls[] = new Class[1];
                Object obj[] = new Object[1];            try {
                    String fil = BaseFormat.getClassName(fields[i].getType().
                            getName());
                        //得到每个字段的数据类型,也即是set方法的参数类型
                    if (fil.equals("String")) {
                       //
                        cls[0] = Class.forName("java.lang.String");
                        //声明该set方法的参数类型
                        obj[0] = rs.getString(tempField);
                        //传入其具体的参数,此等价与  setXXX(tempField);
                    } else if(fil.equals("int")){
                        cls =  new Class[] {int.class};
                        obj = new Object[]{new Integer(rs.getInt(tempField))};                }else if(fil.equals("long")){
                        cls =  new Class[] {long.class};                    obj = new Object[]{new Long(rs.getLong(tempField))};
                    }            } catch (Exception ex) {                log.error("asd" +ex);
                }
                try {                    method=c.getMethod(tempMethod,cls);
                        //通过方法名和参数类型确定得到一个方法
                } catch (Exception ex1) {
                    log.error("method" + ex1);
                }
                try {                method.invoke(myForm, obj);
                    //执行此方法,(myForm为执行的具体对象,obj为传的参数值)
                } catch (Exception ex2) {
                    log.error(ex2);
                }
            }
            return myForm;
        }
      

  2.   

    to lz:
    leckylee说的很清楚了,反射在得到某一个变量或者方法的时候是要把实例传入的to pastom:
    当然了
    我替上面回答了
    反射的作用很多,如遍历对象及方法。而且最方便的就是能够自动调用需要的方法
    给个例子:
    class FatherOperator{
       public void operator(){
       }
    }class OperatorA extends FatherOperator{
       public void operator(){
       }
    }class OperatorB extends FatherOperator{
       public void operator(){
       }
    }如果你的程序是从socket接收操作指令A或B,然后调用相应的操作代码,只需要通过反射找到需要的OperatorB或OperatorA,然后调用operator()方法就可以了。这样程序接口不许变化,有新的需求时添加新的OperatorX类就可以了,这样程序的扩展就容易多了。
    还有很多用途,自己想想。不过反射对效率是有影响的,相关部分代码不可以搅乱。
      

  3.   

    String fil = BaseFormat.getClassName(fields[i].getType().
                            getName());
    请问BaseFormat.getClassName()是什么意思,BaseFormat是自己写的类吗