new一个对象可能非常熟悉,但由于反序列化,反射,克隆在开发中用得不多,有些会生疏。
先定义一个简单的HelloBean,他有一个接口IHelloBean,还有会抛出异常NullNameException。
package
com.kompakar.tutorial.object.common;
import
java.io.Serializable;
//
接口继承Cloneable,Serializable,可以用来克隆和序列化
public
interface
IHelloBean
extends
Cloneable,Serializable
...
{ String echoHello(String name) throws NullNameException; IHelloBean clone() throws CloneNotSupportedException; String getName(); }
HelloBean实现IHelloBean实现方法
package
com.kompakar.tutorial.object.common.impl;
import
com.kompakar.tutorial.object.common.IHelloBean;
import
com.kompakar.tutorial.object.common.NullNameException;
public
class
HelloBean
implements
IHelloBean
...
{ private static final long serialVersionUID = 7694044778894190986L; private String name ; public HelloBean()...{ } public HelloBean(String name)...{ this.name = name; } //具体的业务方法 @Override public String echoHello(String name) throws NullNameException ...{ if(name != null && name.length() > 0)...{ return "Hello," + name + "!"; }else...{ throw new NullNameException("Null Name Exception"); } } //利用Object.clone()实现克隆 @Override public HelloBean clone() throws CloneNotSupportedException ...{ return (HelloBean) super.clone(); } public String getName() ...{ return name; } public void setName(String name) ...{ this.name = name; } }
自定义的业务异常,和得到对象没有关系
package
com.kompakar.tutorial.object.common;
public
class
NullNameException
extends
Exception
...
{ private static final long serialVersionUID = -8862603561913984398L; public NullNameException(String message) ...{ super(message); } }
我想new一个对象不用说,在这里还是写一下:
package
com.kompakar.tutorial.object.newo;
import
com.kompakar.tutorial.object.common.IHelloBean;
import
com.kompakar.tutorial.object.common.NullNameException;
import
com.kompakar.tutorial.object.common.impl.HelloBean;
public
class
NewObjectTest
...
{ /** *//** * @param args */ public static void main(String[] args) ...{ //得到对象 IHelloBean helloBean = new HelloBean(); try ...{ //调用业务方法 String msg = helloBean.echoHello("Allen"); //打印出返回的消息 System.out.println(msg); } catch (NullNameException e) ...{ System.out.println(e.getMessage()); } }}
序列化/反序列化的过程是先将对象按照特定的规范,将对象序列化,形成一个可以存储传输的流。反序列化就是将该流转变成对象。
package
com.kompakar.tutorial.object.objectstream;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
com.kompakar.tutorial.object.common.IHelloBean;
import
com.kompakar.tutorial.object.common.NullNameException;
import
com.kompakar.tutorial.object.common.impl.HelloBean;
public
class
SerializTest
...
{ /** *//** * @param args */ public static void main(String[] args) ...{ //得到对象 IHelloBean helloBean = new HelloBean("Benewu"); try ...{ //将对象写到本地,可以在磁盘中发现HelloBean.dat文件 ObjectOutputStream objout = new ObjectOutputStream(new FileOutputStream("HelloBean.dat")); objout.writeObject(helloBean); objout.close(); //将本地的HelloBean.dat文件取出来并且转成对象 ObjectInputStream objin = new ObjectInputStream(new FileInputStream("HelloBean.dat")); IHelloBean aHelloBean = (IHelloBean) objin.readObject(); objin.close(); String msg = aHelloBean.echoHello("Allen"); System.out.println(aHelloBean.getName()); System.out.println(msg); } catch (FileNotFoundException e) ...{ e.printStackTrace(); } catch (IOException e) ...{ e.printStackTrace(); }catch(ClassNotFoundException e)...{ e.printStackTrace(); }catch(NullNameException e)...{ e.printStackTrace(); } }}
利用Object.clone()可以得到一个深度克隆的对象。
package
com.kompakar.tutorial.object.cloneo;
import
com.kompakar.tutorial.object.common.IHelloBean;
import
com.kompakar.tutorial.object.common.NullNameException;
import
com.kompakar.tutorial.object.common.impl.HelloBean;
public
class
CloneTest
...
{ /** *//** * @param args */ public static void main(String[] args) ...{ IHelloBean helloBean = new HelloBean(); try ...{ IHelloBean helloBeanClone = helloBean.clone(); System.out.println(helloBeanClone.echoHello("Bene")); } catch (CloneNotSupportedException e) ...{ e.printStackTrace(); }catch(NullNameException e)...{ System.out.println(e.getMessage()); } }}
反射使用得比较多, 可以利用XML定义类型和参数,在使用的时候再动态加载。
package
com.kompakar.tutorial.object.reflectiono;
import
java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.Method;
import
com.kompakar.tutorial.object.common.IHelloBean;
import
com.kompakar.tutorial.object.common.NullNameException;
public
class
ReflectionTest
...
{ /** *//** * @param args * @throws InvocationTargetException * @throws * @throws NoSuchMethodException * @throws SecurityException */ public static void main(String[] args) ...{ try ...{ //定义对象类型 Class c= Class.forName("com.kompakar.tutorial.object.common.impl.HelloBean"); Object obj; //得到对象实例并且直接调用业务方法 obj = c.newInstance(); IHelloBean helloBean = (IHelloBean)obj; String msg = helloBean.echoHello("Baby"); System.out.println(msg); //在这里可能永远都不知道方法名字是什么,而是动态加载进来,并进行访问 //动态调用业务方法 Class sc = Class.forName("java.lang.String"); Method m = c.getMethod("echoHello", new Class[]...{sc}); Object returnObj = m.invoke(helloBean, "GIGI"); System.out.println((String)returnObj); } catch (InstantiationException e) ...{ e.printStackTrace(); } catch (IllegalAccessException e) ...{ // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) ...{ e.printStackTrace(); }catch (NullNameException e) ...{ System.out.println(e.getMessage()); } catch(SecurityException e)...{ e.printStackTrace(); }catch(NoSuchMethodException e)...{ e.printStackTrace(); }catch(IllegalArgumentException e)...{ e.printStackTrace(); }catch(InvocationTargetException e)...{ e.printStackTrace(); } }}