四种得到java对象的方法
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();
????????????}
????}
}