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