为了账号安全,请及时绑定邮箱和手机立即绑定

java反射问题求解

java反射问题求解

波斯汪 2019-03-14 22:15:44
写一个方法: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;        }    }谢谢~~
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

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


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

    }

}

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


查看完整回答
反对 回复 2019-04-20
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


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


查看完整回答
反对 回复 2019-04-20
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2019-04-20
  • 3 回答
  • 0 关注
  • 596 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信