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();
}
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;
}
}
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);
}
}
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());
}
}
}
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();
}
}
}
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());
}
}
}
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();
}
}
}
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();
}
}
}