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();
}
}
}
深入探讨Java对象操作与技术应用
本文详细介绍了Java中对象操作的相关概念,包括新创建对象、序列化与反序列化、克隆、反射等常见技术的应用。通过具体示例展示了如何实现接口、异常处理、对象克隆以及反射机制的使用,同时介绍了Java对象序列化与反序列化的流程。文章还涉及到对象的深度克隆、业务方法调用、自定义异常以及XML动态加载类型的实践案例。
966

被折叠的 条评论
为什么被折叠?



