JAVA 基本题 难倒一堆人

来源:百度知道 编辑:UC知道 时间:2024/06/14 18:10:30
现在有一个需求,前提是:一个类A,里面有比较多的字段(超过50个),有setter和getter,是个很普通的pojo类,但是已经是class文件了。也就是不改变这个类内容和结构。同时,通过外部接口可以获得字段都已经赋值的实例。也就是有个类,你可以获得他的被赋值的实例。
需求是这样的,有一个类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中