JAVA 基本题 难倒一堆人
来源:百度知道 编辑:UC知道 时间:2024/06/14 18:10:30
需求是这样的,有一个类B,里面含有的字段很多和类A相同,不过也有多几个自己的字段,少几个类A的字段,现在要求,把不通过繁琐的setter和getter方法赋值,也不用反射,从类B里获得与类A含义相同的字段的值。同时,自身字段的值也可以赋值和取出。
看清楚再答,类A的实例已经产生,并且已经字段已经被赋值了。你还A a = new B();里面字段不都空了吗?回答前先看清楚。 另一个更厉害,用IO啊?还不如用反射呢。 拜托,看清楚,是说了不用反射的嘛,不用翻译成reflect忽悠我吧? 不用耗很大的资源,reflect耗资源很大的,还不如set进去。深度克隆说说是啥意思?
不通过反射的话做不到吧,为什么加不通过反射的限制?用commons-beanutils.jar包的BeanUtils.copyProperties()方法可以轻松完成你的要求,它的两个传参对象只要里面的属性名称一样就会把第一个的值copy给第二个,例如BeanUtils.copyProperties(A,B)这样子就完成了你的要求。可惜它是通过反射的。
也可以通过getMethods或getDeclaredFields()来取得类的方法和属性,放在一个集合里,然后两个集合做比较,如果A里面有的方法或属性就给B赋上A的值,如果A里面没有的就自己赋值,但是底层的东西也是通过反射的。
反射的系统开销也没你说的那么大,很多保险公司的保费计算也都是透过反射来计算的。如果用克隆的话B继承A(A实现Cloneable接口),然后 B b=(B)a.clone();即可把A值赋给B .并不觉得效率比反射高多少
将B作为A的子类啊。然后A a = new B();就好了嘛。
补充:
其实我只是告诉你一个思路罢了,利用多态的原则,你既然A是实例的话,那么B如果是子类的话也是A的实例得一种形态罢了。所以你只要将A强制转化成B,然后在对B的单独赋值不就完了?还有就你这种口气谁还会吊你。请自重
用reflection就行了,具体api参见java.lang.reflect包
思路就是通过a的class来取得a中所有get方法,再通过方法名遍历比对b中的set方法,如果相同就通过invoke a的set方法来为b的get方法赋值,代码我就懒得写了
呵呵 可以采用深度克隆,但前提是类A必须实现Cloneable和Serializable接口。
用IO操作 加上条件限制 剔除掉A.class文件里无关的内容
然后写入B中