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

写一个方法:
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讲师

membalas semua(3)
巴扎黑

Reka bentuk antara muka supaya semua kelas yang ingin memanggil fungsi ini melaksanakan antara muka ini

interface IHaveTm {
    void setIsTm(String isTm);
    String getIsTm();
}

public void <T extends IHaveTm> updateIsTm(T t, ...) {
    t.setIsTm(...)
}

Tambahan:
Jika anda tidak mengubah suai kelas yang memanggil fungsi ini dan melakukan reka bentuk yang tidak mengganggu, anda mungkin hanya boleh menggunakan refleksi

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

Dalam kes ini, anda perlu bergantung pada perjanjian untuk memastikan keselamatan panggilan Ini tidak disyorkan

刘奇
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);
    }
}

Hasil keluaran:

A sedang menetapkan isTm=haha
B sedang menetapkan isTm=haha lagi

Berdasarkan tajuk, saya tidak nampak keperluan untuk reka bentuk generik.

Ty80

Dari perspektif reka bentuk, lebih baik mereka bentuk antara muka atau kelas abstrak untuk mengabstrakkan atribut isTm.

Tetapi jika anda tidak lagi boleh mengubah suai kelas ini, dan mereka tidak mewarisi atau melaksanakan kelas induk atau antara muka biasa, maka anda hanya boleh menggunakan refleksi.

Tetapi menggunakan refleksi akan menjadikan kod itu sangat hodoh, dan sukar untuk mencari masalah Jika ia tidak digunakan dengan baik, ia adalah tingkah laku medan ranjau.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!