当前位置: 主页 > JAVA语言

java通过反射创建对象-Java中创建对象的4种方法:使用newInstance方法

发布时间:2023-07-13 07:03   浏览次数:次   作者:佚名

Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法。

总结下来有以下4种创建对象的方法:

1. 使用 new 关键字

最常见的 Java 对象的构造方法,通过调用类提供的构造器创建对象。

2. 使用 newInstance() 方法

Java 反射中有一个 newInstance() 方法,可以创建对象,步骤如下:

示例代码:

第一弹:Java 中创建对象的4种方式

java如何通过反射创建对象_java通过反射创建对象_用反射创建对象

第一弹:Java 中创建对象的4种方式

public class MethodNewInstance {
 
     public static void main(String[] args) throws Exception {
 
         // 得到类对象
         Class clazz = Class.forName("com.gerrard.create.method_newInstance.ObjectToCreate");
         // 类对象的 newInstance() 方法,只能调用公有的无参构造器
         clazz.newInstance();
 
         // 得到构造器对象数组(不管是私有还是公有的构造器)
         Constructor[] cons = clazz.getDeclaredConstructors();
         cons[1].newInstance();
         cons[2].newInstance("Gerrard");
         // 先打破私有构造器不可访问的限制
         cons[0].setAccessible(true);
         cons[0].newInstance("Gerrard", "Info");
     }
 }

MethodNewInstance

备注:

3. 使用 clone() 方法

Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 native(),在给定对象的基础上,创建一个完全相同的对象。步骤如下:

用反射创建对象_java如何通过反射创建对象_java通过反射创建对象

示例代码:

第一弹:Java 中创建对象的4种方式

第一弹:Java 中创建对象的4种方式

public class ObjectToCreate implements Cloneable {
 
     // 重写 Object 类的 clone() 方法(native 方法)
     public ObjectToCreate clone() {
         ObjectToCreate obj = null;
         try {
             obj = (ObjectToCreate) super.clone();
         } catch (CloneNotSupportedException e) {
             // 没有实现 Cloneable 接口就会抛出这个异常
             e.printStackTrace();
         }
         return obj;
     }
 }

ObjectToCreate

备注:

java通过反射创建对象_java如何通过反射创建对象_用反射创建对象

4. 使用反序列化的 readObject() 方法

这个方法一共分两步:

序列化:

反序列化:

示例代码:

第一弹:Java 中创建对象的4种方式

java通过反射创建对象_java如何通过反射创建对象_用反射创建对象

第一弹:Java 中创建对象的4种方式

public class ObjectToCreate implements Serializable {
 
     private static final long serialVersionUID = 1L;
     
     private Object writeReplace(){
         return new Integer(1);
     }
     
     private Object readResolve(){
         return new Double(2);
     }
 }

ObjectToCreate

第一弹:Java 中创建对象的4种方式

第一弹:Java 中创建对象的4种方式

public class MethodSerialable {
 
     public static void main(String[] args) {
 
         // 默认路径是项目的根路径
         final String fileName = "./file/serialable.txt";
 
         ObjectToCreate o1 = new ObjectToCreate();
 
         // 序列化
         try (FileOutputStream fos = new FileOutputStream(fileName);
                 ObjectOutputStream oos = new ObjectOutputStream(fos);) {
             oos.writeObject(o1);
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

java通过反射创建对象_用反射创建对象_java如何通过反射创建对象

MethodSerialable

第一弹:Java 中创建对象的4种方式

第一弹:Java 中创建对象的4种方式

public class MethodAntiSerialable {
 
     public static void main(String[] args) {
         // 默认路径是项目的根路径
         final String fileName = "./file/serialable.txt";
         Object o2 = null;
         // 反序列化
         try (FileInputStream fio = new FileInputStream(fileName); ObjectInputStream ois = new ObjectInputStream(fio);) {
             o2 = ois.readObject();
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (ClassNotFoundException e) {
             e.printStackTrace();
         }
         System.out.println(o2);
     }
 }

MethodAntiSerialable

备注:

5.总结

Java创建对象的4种方法:第一种是最常用的;第二种方法深入至源码会指向sun.reflect.ConstructorAccessor类,JDK中似乎没有提供继续深入下去的源码,但是既然是调用构造器的方法java通过反射创建对象,那么与第一种方法一样,创建的对象是存储在堆(Heap)中的;第三种方法是要实现特定的接口才可以使用,而且是通过调用native方法,也就是非Java代码(很大可能是C)实现的,也就是说,这个方法产生的对象,可能不会被GC回收(个人的想法),因为GC是用来回收Java代码创造的对象,所以要慎用;第四种方法在序列化的时候,需要实现特定的接口,而在反序列化时就不关心这一点了java通过反射创建对象,它是将对象暂存于其他媒介中,在反序列化的时候将对象存于堆中。