谷安天下安全易视系统能帮助领导直观看到员工网络与信息安全知识学习的情况吗?

博客访问: 368449
博文数量: 86
博客积分: 4026
博客等级: 上校
技术积分: 632
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
今天做项目时,碰到一个棘手的问题,就是需要把一个对象的属性完全拷贝到另一个对象上.
其实当前项目中的这个对象是个简单对象(即属性不包括对其他对象的引用)
最后简单的用浅拷贝完成了对象的拷贝.即在实体类中实现Clonable接口,实现 public Object Clone()方法.
通过调用父类的super.clone()方法(浅拷贝)可以重新生成一个对象,解决因对象引用赋值造成的原对象的修改.
如& Student s=new Student("wangyan",23);
&&&Student s2=s;
&&&s2.setName("ZhangSan"); //实际上改的是Student s, 使得 wangyan=&ZhangSan
而应该才用浅拷贝的方法
& Student s2=s.clone();
& s2.setName("ZhangSan");
===============================================================================
&&&&&&&&&&&&&&&&&&&& 深拷贝与浅拷贝的区别
1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。⑵深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。2.Java的clone()方法⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。⑵Java中对象的克隆①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。②在派生类中覆盖基类的clone()方法,并声明为public。③在派生类的clone()方法中,调用super.clone()。④在派生类中实现Cloneable接口。请看如下代码:
class Student implements Cloneable{&&&& S&&&&&&& Student(String name,int age)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&& }&&& public Object clone()&&&& {&&&&&&&& Object o=&&&&&&& try&&&&&&&& {&&&&&&&& o=(Student)super.clone();//Object中的clone()识别出你要复制的是哪一// 个对象。&&&&&&&& }&&&&&&& catch(CloneNotSupportedException e)&&&&&&&& {&&&&&&&&&&&& System.out.println(e.toString());&&&&&&&& }&&&&&&&&&&& }
public static void main(String[] args)&&&& {&&&&&& Student s1=new Student("zhangsan",18);&&&&&& Student s2=(Student)s1.clone();&&&&&& s2.name="lisi";&&&&&& s2.age=20;&&&&& System.out.println("name="+s1.name+","+"age="+s1.age);//修改学生2后,不影响&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //学生1的值。&&& }}说明:①为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。②继承自java.lang.Object类的clone()方法是浅复制。以下代码可以证明之。
class Professor implements Cloneable{&&&& S&&&&&&& Professor(String name,int age)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&& }&&&& public Object clone() throws CloneNotSupportedException{&&& & return super.clone();&&&& }}class Students implements Cloneable{&&&& S//常量对象。&&&&&&& P//学生1和学生2的引用值都是一样的。&&&& Students(String name,int age,Professor p)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&&&&& this.p=p;&&&& }&&& public Object clone()&&&& {&&&&&&&& Students o=&&&&&&& try&&&&&&&& {&&&&&&&&&&&& o=(Students)super.clone();&&&&&&&&&&&& o.p=(Professor)p.clone();&&&&&&&& }&&&&&&& catch(CloneNotSupportedException e)&&&&&&&& {&&&&&&&&&&&& System.out.println(e.toString());&&&&&&&& }&&&&&& &&&&&&&&&&& }
public static void main(String[] args)&&&& {&&&&&& Professor p=new Professor("wanGWu",50);&&&&&& Students s1=new Students("zhangsan",18,p);&&&&&& Students s2=(Students)s1.clone();&&&&&& s2.p.name="lisi";&&&&& s2.p.age=30;&&&&& System.out.println("name="+s1.p.name+","+"age="+s1.p.age);//学生1的教授&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //成为lisi,age为30。&&&& }}那应该如何实现深层次的克隆,即修改s2的教授不会影响s1的教授?代码改进如下。改进使学生1的Professor不改变(深层次的克隆)
/** &* @author sophia wang&* @since
下午02:02:05 &* 类说明:&*/class Professor implements Cloneable{&&&& S&&&&&&& Professor(String name,int age)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&& }&&& public Object clone()&&&& {&&&&&&&& Object o=&&&&&&& try&&&&&&&& {&&&&&&&&&&&& o=super.clone();&&&&&&&& }&&&&&&& catch(CloneNotSupportedException e)&&&&&&&& {&&&&&&&&&&&& System.out.println(e.toString());&&&&&&&& }&&&&&&&&&&& }}class Student implements Cloneable{&&&& S&&&&&&& P&&&& Student(String name,int age,Professor p)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&&&&& this.p=p;&&&& }&&& public Object clone()&&&& {&&&&&&&& Student o=&&&&&&& try&&&&&&&& {&&&&&&&&&&&& o=(Student)super.clone();&&&&&&&& }&&&&&&& catch(CloneNotSupportedException e)&&&&&&&& {&&&&&&&&&&&& System.out.println(e.toString());&&&&&&&& }&&&&&&&& o.p=(Professor)p.clone();&&&&&&&&&&& }
public static void main(String[] args)&&&& {&&&&&& Professor p=new Professor("wangwu",50);&&&&&& Student s1=new Student("zhangsan",18,p);&&&&&& Student s2=(Student)s1.clone();&&&&&& s2.p.name="lisi";&&&&& s2.p.age=30;&&&&& System.out.println("name="+s1.p.name+","+"age="+s1.p.age);//学生1的教授不改变。&&&& }}3.利用串行化来做深复制把对象写到流里的过程是串行化(Serilization)过程,但是在Java程序师圈子里又非常形象地称为“冷冻”或者“腌咸菜(picking)”过程;而把对象从流中读出来的并行化(Deserialization)过程则叫做“解冻”或者“回鲜(depicking)”过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面,因此“腌成咸菜”的只是对象的一个拷贝,Java咸菜还可以回鲜。在Java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里(腌成咸菜),再从流里读出来(把咸菜回鲜),便可以重建对象。如下为深复制源代码。
public Object deepClone() throws IOException, ClassNotFoundException{//将对象写到流里&ByteArrayOutputStream bo=new ByteArrayOutputStream();&ObjectOutputStream oo=new ObjectOutputStream(bo);&oo.writeObject(this);&//从流里读出来&ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());&ObjectInputStream oi=new ObjectInputStream(bi);&return(oi.readObject());}这样做的前提是对象以及对象内部所有引用到的对象都是可串行化的,否则,就需要仔细考察那些不可串行化的对象可否设成transient,从而将之排除在复制过程之外。上例代码改进如下。
class Professor implements Serializable{&&&& S&&&&&&& Professor(String name,int age)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&& }}class Student implements Serializable{&&&& S//常量对象。&&&&&&& P//学生1和学生2的引用值都是一样的。&&&& Student(String name,int age,Professor p)&&&& {&&&&&&& this.name=&&&&&&& this.age=&&&&&&& this.p=p;&&&& }&public Object deepClone() throws IOException,OptionalDataException,ClassNotFoundException{&&//将对象写到流里&&ByteArrayOutputStream bo=new ByteArrayOutputStream();&&ObjectOutputStream oo=new ObjectOutputStream(bo);&&oo.writeObject(this);&&//从流里读出来&&ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());&&ObjectInputStream oi=new ObjectInputStream(bi);&&return(oi.readObject());}
public static void main(String[] args) throws OptionalDataException, IOException, ClassNotFoundException&&&& {&&&&&& Professor p=new Professor("wangwu",50);&&&&&& Student s1=new Student("zhangsan",18,p);&&&&&& Student s2=(Student)s1.deepClone();&&&&&& s2.p.name="lisi";&&&&& s2.p.age=30;&&&&& System.out.println("name="+s1.p.name+","+"age="+s1.p.age); //学生1的教授不改变。&&&& }}
阅读(4127) | 评论(5) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
你举的用例与你要表达的不一致,还误导了我!!!!
我觉得写得挺好的。支持。
蛮清楚的,也可以运行,作者别受打击啊。blog是用来也自己想写的事的,怎么能说摆显了。
1. 大括号放得不是地方;
2. o.p=(Professor)p.clone();没法操作,应该删除这一行,或改成o.p=(Professor)p;
贴出来的代码,无法运行,这是通病。行家,不会看这玩意儿;需要这些东东的,不是行家,是初学者。在初学者面前,摆显无意义。
你的第二个代码里
o.p=(Professor)p.clone();
好像有点问题啊。
请登录后评论。1、说明:string[]reqItems是需要复制的列属性,可以在调用的时候就指定复制哪些字段,而略过其它不需要复制的字段。boolcreate指定是复制,还是新建?2、用途:(1)用于相同实体类之
问题描述1、说明:string[]reqItems是需要复制的列属性,可以在调用的时候就指定复制哪些字段,而略过其它不需要复制的字段。boolcreate指定是复制,还是新建?2、用途:(1)用于相同实体类之间的数据复制。(2)用于不同实体类之间的数据复制。(3)用于多个实体类合成为新的实体类。3、示例:下面是我们原来更新数据时的代码,是不是很麻烦?varrow=rows.FirstOrDefault();if(row==null)row.StockCode=webItem.StockCrow.StockMarket=webItem.StockMrow.StockName=webItem.StockNrow.PriceClose=webItem.PriceCrow.RatioChange=webItem.RatioCrow.DateTimeUpdate=DateTime.Nrow.FlagStatus=0;row.Para1_RatioAmp=webItem.Para1_RatioArow.Para1_RatioChange=webItem.Para1_RatioCrow.Para1_PriceHigh=webItem.Para1_PriceHrow.Para1_PriceLast=webItem.Para1_PriceLrow.Para1_PriceLower=webItem.Para1_PriceLrow.Para1_PriceClose=webItem.Para1_PriceCrow.Para1_PriceOpen=webItem.Para1_PriceOrow.Para1_TradeAmount=webItem.Para1_TradeArow.Para1_TradeVolume=webItem.Para1_TradeVrow.Para1_RatioTurnOver=webItem.Para1_RatioTurnOrow.Para2_RatioAmp=webItem.Para2_RatioArow.Para2_RatioChange=webItem.Para2_RatioCrow.Para2_PriceHigh=webItem.Para2_PriceHrow.Para2_PriceLast=webItem.Para2_PriceLrow.Para2_PriceLower=webItem.Para2_PriceLrow.Para2_PriceClose=webItem.Para2_PriceCrow.Para2_PriceOpen=webItem.Para2_PriceOrow.Para2_TradeAmount=webItem.Para2_TradeArow.Para2_TradeVolume=webItem.Para2_TradeVrow.Para2_RatioTurnOver=webItem.Para2_RatioTurnOrow.Para3_RatioAmp=webItem.Para3_RatioArow.Para3_RatioChange=webItem.Para3_RatioCrow.Para3_PriceHigh=webItem.Para3_PriceHrow.Para3_PriceLast=webItem.Para3_PriceLrow.Para3_PriceLower=webItem.Para3_PriceLrow.Para3_PriceClose=webItem.Para3_PriceCrow.Para3_PriceOpen=webItem.Para3_PriceOrow.Para3_TradeAmount=webItem.Para3_TradeArow.Para3_TradeVolume=webItem.Para3_TradeVrow.Para3_RatioTurnOver=webItem.Para3_RatioTurnOrow.Para4_RatioAmp=webItem.Para4_RatioArow.Para4_RatioChange=webItem.Para4_RatioCrow.Para4_PriceHigh=webItem.Para4_PriceHrow.Para4_PriceLast=webItem.Para4_PriceLrow.Para4_PriceLower=webItem.Para4_PriceLrow.Para4_PriceClose=webItem.Para4_PriceCrow.Para4_PriceOpen=webItem.Para4_PriceOrow.Para4_TradeAmount=webItem.Para4_TradeArow.Para4_TradeVolume=webItem.Para4_TradeVrow.Para4_RatioTurnOver=webItem.Para4_RatioTurnO现在用一个通用的方法就避免了需要手工去写那些代码。privatevoidUpdateMarket&TSource,TTarget&(TSources,TTargett,string[]reqItems=null,boolcreate=false)whereTSource:new()whereTTarget:new(){foreach(varpint.GetType().GetProperties())//以目标表为参照对象{//复制到本地变量varp1=p;//PkId字段略过,Insert时略过Update,Update时略过Create。if(pareExt("PkId")||(create?pareExt("DateTimeUpdate"):pareExt("DateTimeCreate")))if(reqItems!=null&&reqItems.All(w=&w!=p1.Name))vars1=s.GetType().GetField(p1.Name);//找到来源实体类的字段信息if(s1!=null){p1.SetValue(t,s1.GetValue(null),null);}else{vars2=s.GetType().GetProperty(p1.Name);if(s2==null)p1.SetValue(t,s2.GetValue(s,null),null);}}}解决方案本帖最后由 wtoeb 于
10:58:37 编辑解决方案二:数据量大的话,调用起来是方便,但性能有点点卡解决方案三:真的要在基础框架中使用的话,性能是不得不考虑的事情。解决方案四:我们小散考虑的是效率,等把项目快速的完成了,你再用那个复杂代码的方式去完善项目,不就用了么?解决方案五:也未尝不可,写两套方法:第一个反射看效果,第二个model赋值提高性能;还可以向用户多收取维护费用,妙哉妙哉!解决方案六:通常大量的这类代码都是直接生成的。。。解决方案七:固定的几个copy方法都会有的,不是所有的copy方法都不写。但是如果它比较繁琐,首先要考虑到程序设计者不懂得面向对象的机制才造成的。这种问题的后果才比较严重,不是用一堆低效的方式可以弥补的。解决方案八:这个挺好用的,学过反射的应该都会了,只是用不着泛型的语法和where条件.解决方案九:用Expression表达式树会更快,接近直接赋值的性能。解决方案十:刚刚写了一篇。http://bbs.csdn.net/topics/解决方案十一:不错.....解决方案十二:可以用ExpandoObject和ConcurrentDictionary写一个解决方案十三:http://www.sdchengyiwood.co辐射松集成材解决方案十四:辐射松集成材解决方案十五:谢谢分享
【云栖快讯】支撑千亿营收,阿里如何做研发?淘宝如何做敏捷实践?如何面对开发中的“黑天鹅”事件?6月29日首届阿里研发效能嘉年华,独家直播,赶紧预约吧!&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...java中抽象类是否可以继承实体类
一道java 常见面试题,网上找到的几乎每个 java 面试笔试题大全或集锦里都能找到这道题。
题目如下:
问: 抽象类是否可继承实体类 (concrete class)
答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数
答案很明确,可以继承。其实从Object就是个实体类,java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。
关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思。
一般学习者会写的简单试验代码:
class A{}abstract class B extends A{}
结果完全正常,编译通过。似乎和“实体类必须有明确的构造函数”完全没有关系。
这个问题涉及到两个个基础知识:
1.所有的class都必须有一个构造方法,如果你没有在代码里声明构造方法,系统会自动给你生成一个公有无参的构造方法。而只要你自己声明了一个构造方法,无论有参无参,私有公有,系统就不再帮你生成默认无参构造器了。
2.所有的子类构造器都要求在第一行代码中调用父类构造器,如果不写,系统默认去调用父类的无参构造器。
所以,如果把系统默认配给的方法也算进去,class A{}的代码实际上是
public A(){}
B继承 A 的时候,则是
abstract class B extends A{
public B(){
要试验出这继承规则的内部情况,也很简单,在最上面那个简单试验代码里,加上个私有构造器,有参无参都行。
private A(){}
这个时候,如基础知识(1) 中所说,系统不再给你默认无参构造器,
B的构造器根据(2)中的规则去调用super(),却找不到A的无参构造器,所以导致abstract class B extends
编译不能通过。(因为A中没有任何构造器可供子类调用,其实这个时候A只能够供内部类继承,我用的Eclipse的3.4版本会建议给B改名,但是这解决不了这个问题。)
现在,你应该了解了资料给的那句语焉不详的“实体类必须有明确的构造函数”的含义:
1.没写构造器的,那是拥有默认无参公有构造函数的,子类可以什么都不写,让默认构造器去调用它。这是最初那两行代码的情况。
2.写了子类可访问的无参构造器的,也是一样,子类里可以什么都不写,用默认机制调用。
有参构造器却没写无参构造器的,父类里没有子类可访问的无参构造器,子类必须在子类构造器里的第一句写明,调用父类有参构造器,并把参数传进去。
4.声明为final的以及所有构造器都不在子类访问权限之内的类无法继承
其实只要是在类的继承中,无论抽象还是实体,都需要符合这个规则的。在这个继承试验中随时删掉或是加上abstract的前缀,结果都没有变化。个人觉得“实体类必须有明确的构造函数”一句实在是无法把这个情况表达清楚,所以广大求职者还是写得清楚些好。
我喜欢的写法是“可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。”
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。您所在的位置: &
打印List中Userinfo.java实体类示例(1)
打印List中Userinfo.java实体类示例(1)
清华大学出版社
《JasperReports+iReport报表开发详解》第1章初识JasperReports,本章将会以若干个应用型的报表示例来作演示,重点掌握以下几个知识点:用iReport创建报表模板的步骤与配置过程使用SQL/JavaBean数据源打印报表使用Parameters参数对象导出PDF文件使用报表常用属性。本节为大家介绍打印List中Userinfo.java实体类示例。
1.3.4& 打印List中Userinfo.java实体类示例(1)
前面的内容演示了使用Parameters参数对象传递字符串的示例,本节将演示打印List接口中Userinfo.java实体类的示例,打印的数据源不是来自于Parameters对象,而是JRBeanCollectionDataSource对象。
新建Web项目,创建Userinfo.java实体类,结构如图1.45所示。
然后把Userinfo.class的路径配置到iReport软件中,如图1.46所示。
单击 按钮添加数据源,选择JavaBean,并且设置选项如图1.47所示。
单击OK按钮后Fields节点下出现3个字段名称,如图1.48所示。
把这3个Fields对象添加到报表模板,如图1.49所示。
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
对于任何一门编程语言来说,算法都是程序的"灵魂"。正是因为算法
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
本书是国内首部关于软件管理平台设计与实现(针对大规
完美决策=直觉+经验+数据
你还在依赖直觉和经验艰难
本书是jQuery 经典技术教程的最新升级版,涵盖jQuery
本书是根据全国计算机技术与软件专业技术资格(水平)考试《网络管理员考试大纲》所要求的考试范围而编写的试题集。全书共分10个
51CTO旗下网站| 漏洞检测 |
| 隐藏捆绑 |
避免实体类空指针异常,并赋初值 可扩展
import java.lang.reflect.InvocationTargetE import java.lang.reflect.M import java.math.BigD import java.util.ArrayL import java.util.L import com.upward.hbnx.model.EC /** * * @author xiaoyang 避免空指针
import java.lang.reflect.InvocationTargetE &
import java.lang.reflect.M &
import java.math.BigD &
import java.util.ArrayL &
import java.util.L &
import com.upward.hbnx.model.EC &
&* @author xiaoyang 空&
&* 类会报空的属性get方法,为其赋值&
public class InitBeanUtil { &
private static InitBeanUtil init = &
private final String START_SET = &set&; &
private final String START_GET = &get&; &
private final String START_IS = &is&; &
private final int START_THREE = 3; // &set&字符串长度 3 &
// 参数初始值---begin &
private final String INIT_STRING = &&; &
private final int INIT_INT = 0; &
private final double INIT_DOUBLE = 0.0; &
private final float INIT_FLOAT = 0; &
private final boolean INIT_BOOLEAN = &
private final char INIT_CHAR = ' '; &
private final BigDecimal INIT_BigDecimal = new BigDecimal(&0.0&); &
private final Integer INIT_Integer = new Integer(0); &
private final Double INIT_Double = new Double(0.0); &
private final Float INIT_Float = new Float(0.0); &
private final Boolean INIT_Boolean = new Boolean(true); &
private final Character INIT_Character = new Character(' '); &
private final java.sql.Date INIT_DateS = new java.sql.Date( &
System.currentTimeMillis()); &
private final java.util.Date INIT_DateU = new java.util.Date( &
System.currentTimeMillis()); &
private final java.sql.Timestamp INIT_Timestamp = new java.sql.Timestamp( &
System.currentTimeMillis()); &
private final long INIT_Long = new Long(0); &
@SuppressWarnings(&rawtypes&) &
private final java.util.List INIT_List = new ArrayList(); &
// 参数初始值---end &
// 参数类型---begin 封装类型给出完整名 &
private final String TYPE_String = &java.lang.String&; &
private final String TYPE_int = &int&; &
private final String TYPE_double = &double&; &
private final String TYPE_float = &float&; &
private final String TYPE_boolean = &boolean&; &
private final String TYPE_char = &char&; &
private final String TYPE_long = &long&; &
private final String TYPE_BigDecimal = &java.math.BigDecimal&; &
private final String TYPE_Integer = &java.lang.Integer&; &
private final String TYPE_Double = &java.lang.Double&; &
private final String TYPE_Float = &java.lang.Float&; &
private final String TYPE_Boolean = &java.lang.Boolean&; &
private final String TYPE_Character = &java.lang.Character&; &
private final String TYPE_DateS = &java.sql.Date&; &
private final String TYPE_DateU = &java.util.Date&; &
private final String TYPE_Timestamp = &java.sql.Timestamp&; &
private final String TYPE_List = &java.util.List&; &
// 参数类型---end &
@SuppressWarnings(&rawtypes&) &
private List setList = new ArrayList(); // 存储所有setter方法 &
@SuppressWarnings(&rawtypes&) &
private List getList = new ArrayList(); // 存储所有getter方法 &
private InitBeanUtil() { &
// 无参构造器 &
public static Object FZ(Object bean) { &
if (init == null) { &
init = new InitBeanUtil(); &
return init.initBean(bean); &
* 初始化属性主要方法&
@SuppressWarnings({ &unchecked&, &rawtypes& }) &
private Object initBean(Object bean) { &
Object object = &
// 实例化bean &
object = bean.getClass().newInstance(); &
// 获取bean的类名 &
Class beanClass = bean.getClass(); &
// 获取该Bean对外公共setter方法 &
Method[] beanMethods = beanClass.getMethods(); &
for (int i = 0; i & beanMethods. i++) { &
if (beanMethods[i].getName().startsWith(START_SET)) { &
this.setList.add(beanMethods[i]); &
} else if (beanMethods[i].getName().startsWith(START_GET) &
|| beanMethods[i].getName().startsWith(START_IS)) { &
this.getList.add(beanMethods[i]); &
for (int i = 0; i & this.setList.size(); i++) { &
Method setMethod = (Method) this.setList.get(i); &
String getMethod = getter(setMethod.getName()); &
// 判断属性是否有get方法 &
if (hasMethod(getMethod)) { &
Method m = (Method) getList.get(i); &
Object o = m.invoke(bean);// 执行get方法返回一个Object &
if (o == null) { &
// set方法参数类型 &
Class[] typeSet = setMethod.getParameterTypes(); &
// javaBean的set方法只有一个参数,只需要取第一个 &
Object[] oarray = initValue(typeSet[0]); &
setMethod.invoke(object, oarray); &
} else { &
Object[] oarray = new Object[1]; &
oarray[0] = &
setMethod.invoke(object, oarray); &
} catch (IllegalArgumentException e) { &
e.printStackTrace(); &
} catch (InvocationTargetException e) { &
e.printStackTrace(); &
} catch (IllegalAccessException e) { &
e.printStackTrace(); &
} catch (InstantiationException e) { &
e.printStackTrace(); &
} catch (SecurityException e) { &
e.printStackTrace(); &
* 获取getter方法 一个属性get方法名&
private String getter(String setter) { &
String getMethod = START_GET + setter.substring(START_THREE); &
if (hasMethod(getMethod)) { &
// 获得getter方法存在返回 &
return getM &
} else { &
// 获得getter方法不在 参数可能是boolean类型 &
getMethod = START_IS + setter.substring(START_THREE); &
if (hasMethod(getMethod)) { &
return getM &
return getM &
* &&判断get方法是否存在&&&
private boolean hasMethod(String MethodName) { &
boolean flag = &
String tempName = &
Method tempMethod = &
for (int k = 0; k & getList.size(); k++) { &
tempMethod = (Method) getList.get(k); &
tempName = tempMethod.getName(); &
if (MethodName.equals(tempName)) { &
* 对属性初始化主要方法&br&&
* 可根据具体需求变动,比如初始化某一类型属性&br&&
private Object[] initValue(@SuppressWarnings(&rawtypes&) Class type) { &
Object[] oarray = new Object[1]; &
// javaBean的setter方法只有一个参数,只需要一个一维Object数组 &
String typeStr = type.getName(); &
if (TYPE_String.equals(typeStr)) { &
// String类型初始化 &
oarray[0] = INIT_STRING; &
} else if (TYPE_int.equals(typeStr)) { &
// int类型初始化 &
oarray[0] = new Integer(INIT_INT); &
} else if (TYPE_double.equals(typeStr)) { &
// double类型初始化 &
oarray[0] = new Double(INIT_DOUBLE); &
} else if (TYPE_float.equals(typeStr)) { &
// float类型初始化 &
oarray[0] = new Float(INIT_FLOAT); &
} else if (String.valueOf(TYPE_char).equals(typeStr)) { &
// char类型初始化 &
oarray[0] = new Character(INIT_CHAR); &
} else if (TYPE_BigDecimal.equals(typeStr)) { &
// BigDecima类型初始化 &
oarray[0] = INIT_BigD &
} else if (TYPE_Integer.equals(typeStr)) { &
// Integer类型初始化 &
oarray[0] = INIT_I &
} else if (TYPE_Double.equals(typeStr)) { &
// Double类型初始化 &
oarray[0] = INIT_D &
} else if (TYPE_Float.equals(typeStr)) { &
// Float类型初始化 &
oarray[0] = INIT_F &
} else if (TYPE_boolean.equals(typeStr)) { &
// boolean类型初始化 &
oarray[0] = new Boolean(INIT_BOOLEAN); &
} else if (TYPE_Boolean.equals(typeStr)) { &
// Boolean类型初始化 &
oarray[0] = INIT_B &
} else if (TYPE_Character.equals(typeStr)) { &
// Character类型初始化 &
oarray[0] = INIT_C &
} else if (TYPE_DateS.equals(typeStr)) { &
// Date类型初始化(java.sql.Date) &
oarray[0] = INIT_DateS; &
} else if (TYPE_DateU.equals(typeStr)) { &
// Date类型初始化(java.util.Date) &
oarray[0] = INIT_DateU; &
} else if (TYPE_Timestamp.equals(typeStr)) { &
// Timestamp类型初始化(java.sql.Timestamp) &
oarray[0] = INIT_T &
} else if (TYPE_List.equals(typeStr)) { &
// List类型初始化(java.util.List) &
oarray[0] = INIT_L &
} else if (TYPE_long.equals(typeStr)) { &
// List类型初始化(java.util.List) &
oarray[0] = INIT_L &
} else { &
oarray[0] = type.newInstance(); &
} catch (InstantiationException e) { &
e.printStackTrace(); &
} catch (IllegalAccessException e) { &
e.printStackTrace(); &
public static void main(String[] args) { &
EChannel test = new EChannel(); &
test.setBizType(&12321&); &
test = (EChannel) InitBeanUtil.FZ(test); &
(责任编辑:幽灵学院)
------分隔线----------------------------
【Java_项目篇(1)】--JAVA实现坦克大战游戏--修改BUG防止坦...
上一篇我们介绍了doclet及其命令行选项,最后是自己自定义的...
控制反转(Inversion of Control,英文缩写为IoC)是一个重...
【JAVA语言程序设计基础篇】--事件驱动程序设计--鼠标事件...
在使用原型模式时,我们需要首先创建一个原型对象,再通过复...
面向对象软件开发的优点有哪些?答:开发模块化,更易维护和...
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院

我要回帖

 

随机推荐