首頁  >  問答  >  主體

spring - java反射问题求解

写一个方法:
public void (类,参数1,参数2) {

}
调用这个方法的类是各个不同的类,但是这些类中都有一个公共的属性isTm,想把这个函数定义成公共的。不同的类传进来,可以根据不同的类,来设置属性isTm的值,应该如何设计和实现?
举例如下:

package basic;

public class Test {

    public void updateIsTm(T<? extends Object> pojo) {
        if (null != pojo) {
            // TODO
            //如果传进来的是A a对象,就调用a.setIsTm()方法,修改值。 
            //如果传进来的是B b对象,就调用b.setIsTm()方法,修改值。
        }
    }
}


 //类A和类B有公共的属性isTm
     
    class A {
    
        String a;
        String isTm;
    
        public String getIsTm() {
            return isTm;
        }
    
        public void setIsTm(String isTm) {
            this.isTm = isTm;
        }
    }
    
    class B {
    
        String b;
        String isTm;
    
        public String getIsTm() {
            return isTm;
        }
    
        public void setIsTm(String isTm) {
            this.isTm = isTm;
        }
    }

谢谢~~

PHP中文网PHP中文网2741 天前228

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 09:24:49

    設計一個介面,讓要呼叫這個函數的類別都實作這個介面

    interface IHaveTm {
        void setIsTm(String isTm);
        String getIsTm();
    }
    
    public void <T extends IHaveTm> updateIsTm(T t, ...) {
        t.setIsTm(...)
    }

    補充:
    如果不修改調用這個函數的類,做無侵入式設計的話,估計只能用反射了

    public void updateIsTm(Object obj, ...) throws Exception {
        Method m = obj.getClass().getDeclaredMethod("setIsTm", String.class);
        if (m != null) {
            m.invoke(obj, ...);
        }
    }

    這樣的話就得靠約定來保證調用的安全性了,不建議這麼做

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:24:49

    public class Main {
    
        public static void main(String[] args) {
            setIsTm(new A(), "haha");
            setIsTm(new B(), "haha again");
        }
        
        public static void setIsTm(TMSetable t, String var1) {
            t.setIsTm(var1);
        }
    }
    
    interface TMSetable {
        public void setIsTm(String isTm);
    }
    
    class A implements TMSetable {
    
        private String isTm;
        
        /* 
         * @see io.beansoft.netty.netty4.bootstrap.TMSetable#setIsTm(java.lang.String)
         */
        @Override
        public void setIsTm(String isTm) {
            this.isTm = isTm;
            System.out.println("A is setting isTm=" + isTm);
        }
        
    }
    
    class B implements TMSetable {
        
        private String isTm;
        /* 
         * @see io.beansoft.netty.netty4.bootstrap.TMSetable#setIsTm(java.lang.String)
         */
        @Override
        public void setIsTm(String isTm) {
            this.isTm = isTm;
            System.out.println("B is setting isTm=" + isTm);
        }
    }

    輸出結果:

    A is setting isTm=haha
    B is setting isTm=haha again

    從題目來看,沒看出有泛型設計的必要。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:24:49

    從設計上來說,設計一個介面或抽象類別將isTm這個屬性抽像出來比較好。

    但如果這些類別你已經沒辦法去修改,而他們之間也沒有繼承或實現共同的父類或接口,那就只能用反射了。

    但用反射的話,會讓程式碼變得很不堪,出問題也不好找,用得不好屬於埋雷行為。

    回覆
    0
  • 取消回覆