package com.telchina.study;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @ProjectName: study
* @Package: com.telchina.study
* @ClassName: StudyNewObject
* @Description: java類作用描述
* @Author: yingch
* @CreateDate: 2020/6/11 19:52
* @UpdateUser: 更新者
* @UpdateDate: 2020/6/11 19:52
* @UpdateRemark: 更新說明
* @Version: 1.0.1
*/
public class StudyNewObject implements Cloneable, Serializable {
public void sayHello(String str) {
System.out.println(str + "Hello World!");
}
public static void main(String[] args) {
methodOne();
methodTwo_One();
methodTwo_Two();
methodTwo_Three();
methodThree();
methodFour();
}
/**
* 1.使用new創建對象
*/
public static void methodOne() {
StudyNewObject o = new StudyNewObject();
o.sayHello("methodOne:new Object():");
}
/**
* 2.使用反射的機制創建對象
* 2.1 使用Class.forName(...)調用默認構造器的newInstance()
*/
public static void methodTwo_One() {
try {
Class c = Class.forName("com.telchina.study.StudyNewObject");//Class.forName(...)返回類
StudyNewObject s = (StudyNewObject) c.newInstance();//class.newInstance()返回對象,其實是利用默認構造器的newInstance方法來創建StudyNewObject對象
s.sayHello("methodTwo_One:Class.forName(...).newInstance():");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
/**
* 2.使用反射的機制創建對象
* 2.2 使用ClassLoader類的loadClass(...)調用默認構造器的newInstance()
*/
public static void methodTwo_Two() {
try {
Class c = ClassLoader.getSystemClassLoader().loadClass("com.telchina.study.StudyNewObject");
StudyNewObject s = (StudyNewObject) c.newInstance();
s.sayHello("methodTwo_Two:ClassLoader.getSystemClassLoader().loadClass(...).newInstance():");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
/**
* 2.使用反射的機制創建對象
* 2.3.使用StudyNewObject類的指定構造器getConstructor().newInstance()
*/
public static void methodTwo_Three() {
try {
Class c = Class.forName("com.telchina.study.StudyNewObject");
Constructor con = c.getConstructor();//利用該Class對象的getConstrutor方法來獲取指定的構造器
StudyNewObject s = (StudyNewObject) con.newInstance();//調用Construtor的newInstance方法來創建StudyNewObject對象
s.sayHello("methodTwo_Three:class.getConstructor().newInstance():");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 3.使用clone,需要實現Cloneable接口,即:public class StudyNewObject implements Cloneable
*/
public static void methodThree() {
StudyNewObject s = new StudyNewObject();
try {
StudyNewObject s2 = (StudyNewObject) s.clone();
s2.sayHello("methodThree:object.clone():");
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
/**
* 4.使用反序列化手段,調用java.io.ObjectInputStream對象的readObject()
* */
public static void methodFour() {
StudyNewObject s = new StudyNewObject();
StudyNewObject s2 = toSerializable(s);
s2.sayHello("methodFour:toSerializable():");
}
public static <T> T toSerializable(T src) throws RuntimeException {
ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
ObjectOutputStream out = null;
ObjectInputStream in = null;
T dist = null;
try {
out = new ObjectOutputStream(memoryBuffer);
out.writeObject(src);
out.flush();
in = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray()));
dist = (T) in.readObject();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (out != null)
try {
out.close();
out = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
if (in != null)
try {
in.close();
in = null;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return dist;
}
}
輸出結果:
methodOne:new Object():Hello World!
methodTwo_One:Class.forName(...).newInstance():Hello World!
methodTwo_Two:ClassLoader.getSystemClassLoader().loadClass(...).newInstance():Hello World!
methodTwo_Three:class.getConstructor().newInstance():Hello World!
methodThree:object.clone():Hello World!
methodFour:toSerializable():Hello World!