spring - java反射问题求解
PHP中文网
PHP中文网 2017-04-18 09:22:49
0
3
283

写一个方法:
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中文网

认证高级PHP讲师

Antworte allen(3)
巴扎黑

设计一个接口,让要调用这个函数的类都实现这个接口

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, ...);
    }
}

这样的话就得靠约定来保证调用的安全性了,不建议这么做

刘奇
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

从题目来看,没看出有泛型设计的必要。

Ty80

从设计上来说,设计一个接口或抽象类将isTm这个属性抽象出来比较好。

但如果这些类你已经没办法去修改,而他们之间也没有继承或实现共同的父类或接口,那就只能用反射了。

但用反射的话,会让代码变得很不堪,出问题也不好找,用得不好属于埋雷行为。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage