Java對象創建的方式探究

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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章