创建对象四种方式JAVA

面试题经常见到,就顺带整理下,创建对象的四种方式:

1.使用new创建对象

2.使用反射创建对象

3.使用clone创建对象

4.使用序列化反序列化创建对象

代码如下:

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @Author: zhangximing
 * @Email: 530659058@qq.com
 * @Date: 2023/9/11 17:47
 * @Description: 创建对象四种方式
 */
public class CreateObject {

    public static void main(String[] args) throws Exception {
        //1、new创建对象
        createByNew();

        //2、反射创建对象
        createByReflect("com.zhangximing.springbootinterceptor.object.MyObject");

        //3、clone创建对象(浅复制)
        createByClone();

        //4、序列化创建对象
        createBySer();
    }

    /**
     * new创建对象
     */
    public static void createByNew(){
        MyObject myObject = new MyObject();
        myObject.create("new创建对象");
    }

    /**
     * 反射创建对象
     * @param classPathName
     * @throws Exception
     */
    public static void createByReflect(String classPathName) throws Exception {
        Class c = Class.forName(classPathName);
        //无参构造方法创建对象
        Object object = c.newInstance();
//        //有参构造器创建对象
//        Constructor privateCon = c.getConstructor(String.class,MyObjectT.class);
//        Object object1 = privateCon.newInstance("测试",new MyObjectT());
        //方法一:强转为指定对象调用方法
        MyObject myObject = (MyObject) object;
        String msg = "反射创建对象";
        myObject.create(msg);
        //方法二:指定方法以及参数进行调用
        Method executeMethod = c.getMethod("createT",String.class,Integer.class);
        Object result = executeMethod.invoke(object,msg,1);
        System.out.println("返回结果:"+result);
    }

    /**
     * clone创建对象(注意对应类需要实现Cloneable)
     */
    public static void createByClone(){
        MyObject myObject = new MyObject();
//        MyObjectT myObjectT = new MyObjectT();
//        myObjectT.setName("测试1");
//        myObject.setMyObjectT(myObjectT);
        //浅拷贝:只拷贝对象本身,不拷贝引用对象
        MyObject myObjectClone = (MyObject) myObject.clone();
        myObjectClone.create("clone创建对象");
    }

    /**
     * 序列化创建对象(注意对应类需要实现Serializable)
     * 序列化:把Java对象转换为字节序列的过程。
     * 反序列化:把字节序列恢复为Java对象的过程。
     * @throws Exception
     */
    public static void createBySer() throws Exception {
        File file = new File("myObject.txt");
        //序列化持久化对象
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
        MyObject myObject = new MyObject("测试序列化",new MyObjectT("被引用对象"));
        out.writeObject(myObject);
        out.close();

        //反序列化,并得到对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
        // 没有强制转换类型
        Object object = in.readObject();
        in.close();
        System.out.println(object);
    }
}
import java.io.Serializable;

/**
 * @Author: zhangximing
 * @Email: 530659058@qq.com
 * @Description: 对象
 */
public class MyObject implements Cloneable, Serializable {

    private String name;

    private MyObjectT myObjectT;

    public MyObject(){}

    public MyObject(String name, MyObjectT myObjectT) {
        this.name = name;
        this.myObjectT = myObjectT;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public MyObjectT getMyObjectT() {
        return myObjectT;
    }

    public void setMyObjectT(MyObjectT myObjectT) {
        this.myObjectT = myObjectT;
    }

    public void create(String msg){
        System.out.println(msg);
    }

    public String createT(String msg,Integer i){
        return "已处理"+i+","+msg;
    }

    @Override
    public MyObject clone() {
        //浅拷贝
        try {
            MyObject clone = (MyObject) super.clone();
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e);
        }
    }

    @Override
    public String toString() {
        return "MyObject{" +
                "name='" + name + '\'' +
                ", myObjectT=" + myObjectT +
                '}';
    }
}
import java.io.Serializable;

/**
 * @Author: zhangximing
 * @Email: 530659058@qq.com
 * @Description: 被引用对象(用于验证浅复制)
 */
public class MyObjectT implements Serializable {

    private String name;

    public MyObjectT(){}

    public MyObjectT(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyObjectT{" +
                "name='" + name + '\'' +
                '}';
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
有两种替代BeanUtils.copyProperties的方法可以考虑使用: 1. 使用BeanMapper:BeanMapper是一个利用javassist类库实现的替代方案,它可以在大量调用时提供更好的性能。你可以通过以下步骤来使用BeanMapper: - 首先,将BeanMapper添加到你的项目中。 - 然后,创建一个映射器接口,定义源对象和目标对象之间的映射规则。 - 最后,使用映射器接口的实现类来执行对象之间的属性复制操作。 以下是使用BeanMapper替代BeanUtils.copyProperties的示例代码[^1]: ```java // 添加BeanMapper到项目中 <dependency> <groupId>net.sf.cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> // 创建映射器接口 public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); void map(SourceObject source, TargetObject target); } // 执行属性复制操作 SourceObject source = new SourceObject(); TargetObject target = new TargetObject(); MyMapper.INSTANCE.map(source, target); ``` 2. 使用MapStruct:MapStruct是另一个强大的替代方案,它可以比BeanUtils.copyProperties更快地执行实体类之间的转换操作。你可以按照以下步骤来使用MapStruct: - 首先,将MapStruct添加到你的项目中。 - 然后,创建一个映射器接口,定义源对象和目标对象之间的映射规则。 - 最后,使用映射器接口的实现类来执行对象之间的属性复制操作。 以下是使用MapStruct替代BeanUtils.copyProperties的示例代码[^2]: ```java // 添加MapStruct到项目中 <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> // 创建映射器接口 @Mapper public interface MyMapper { MyMapper INSTANCE = Mappers.getMapper(MyMapper.class); TargetObject map(SourceObject source); } // 执行属性复制操作 SourceObject source = new SourceObject(); TargetObject target = MyMapper.INSTANCE.map(source); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谦风(Java)

一起学习,一起进步(✪ω✪)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值