Java에서 객체를 작성하는 5가지 방법 요약

6871 단어 java만들다대상
Java 개발자로서 우리는 매일 많은 대상을 만들지만, 우리는 보통 관리 시스템, 예를 들어 Spring에 의존하여 대상을 만든다.그러나 여기에는 대상을 만드는 방법이 매우 많다. 우리는 이 글에서 배울 것이다.
Java에는 객체를 만드는 5가지 방법이 있습니다. 그 예는 다음과 같습니다.
new 키워드 사용하기
} → 구조 함수 호출
Class 클래스를 사용하는 newInstance 방법
} → 구조 함수 호출
Constructor 클래스의 newInstance 사용 방법
} → 구조 함수 호출
clone 방법 사용하기
} → 구조 함수 호출 없음
반서열화 사용
} → 구조 함수 호출 없음
Java 개발자로서 우리는 매일 많은 대상을 만들지만, 우리는 보통 관리 시스템, 예를 들어 Spring에 의존하여 대상을 만든다.그러나 여기에는 대상을 만드는 방법이 매우 많다. 우리는 이 글에서 배울 것이다.
Java에는 객체를 만드는 5가지 방법이 있습니다. 그 예는 다음과 같습니다.
만약 마지막 프로그램을 실행한다면, 방법 1, 2, 3은 구조 함수로 대상을 만들고, 방법 4, 5는 구조 함수를 호출하지 않은 것을 발견할 수 있습니다.
1. new 키워드 사용하기
이것은 가장 흔하고 가장 간단한 대상을 만드는 방식이다.이런 방식을 통해 우리는 임의의 구조 함수를 호출할 수 있다.

Employee emp1 = new Employee();
0: new      #19     // class org/programming/mitra/exercises/Employee
3: dup
4: invokespecial #21     // Method org/programming/mitra/exercises/Employee."":()V
2. Class 클래스를 사용하는 newInstance 방법
Class 클래스의 newInstance 방법을 사용하여 객체를 작성할 수도 있습니다.이 newInstance 방법은 참조 없는 구조 함수를 사용하여 객체를 만듭니다.
다음 방법으로 newInstance 메서드를 호출하여 객체를 만들 수 있습니다.

Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();
//  

Employee emp2 = Employee.class.newInstance();
51: invokevirtual  #70  // Method java/lang/Class.newInstance:()Ljava/lang/Object;
3. Constructor 클래스의 newInstance 사용 방법
Class 클래스의 newInstance 방법과 비슷합니다,java.lang.reflect.Constructor 클래스에도 객체를 만들 수 있는 newInstance 방법이 있습니다.우리는 이 newInstance 방법을 통해 매개 변수와 개인 구조 함수를 호출할 수 있다.

Constructor<Employee> constructor = Employee.class.getConstructor();
Employee emp3 = constructor.newInstance();
111: invokevirtual #80 // Method java/lang/reflect/Constructor.newInstance:([Ljava/lang/Object;)Ljava/lang/Object;
이 두 가지 new Instance 방법은 모두가 말한 반사이다.사실 Class의 new Instance 방법은 내부적으로 Constructor의 new Instance 방법을 호출합니다.스프링, Hibernate, Struts 등 많은 프레임워크가 후자를 사용하는 이유이기도 하다.이 두 가지 new Instance 방법의 차이를 알고 싶은데,
4. 클론 사용 방법
언제든지 우리가 대상의 clone 방법을 호출하면 jvm는 새로운 대상을 만들어서 앞의 대상의 내용을 모두 복사합니다.clone 방법으로 대상을 만들면 구조 함수가 호출되지 않습니다.
clone 방법을 사용하려면 먼저 Cloneable 인터페이스를 실현하고 정의된 clone 방법을 실현해야 합니다.

Employee emp4 = (Employee) emp3.clone();
162: invokevirtual #87 // Method org/programming/mitra/exercises/Employee.clone ()Ljava/lang/Object;
5. 반서열화 사용
우리가 하나의 대상을 서열화하고 반서열화하면 jvm는 우리에게 단독 대상을 만들 것입니다.반서열화할 때, jvm 창설 대상은 어떠한 구조 함수도 호출하지 않습니다.
하나의 대상을 반서열화하기 위해서, 우리는 우리의 클래스가 Serializable 인터페이스를 실현하도록 해야 한다

ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();
261: invokevirtual #118  // Method java/io/ObjectInputStream.readObject:()Ljava/lang/Object;
위의 바이트 세션에서 보듯이 첫 번째 방법을 제외하고 다른 네 가지 방법은 모두 invokevirtual (대상을 만드는 직접적인 방법), 첫 번째 방법은 두 개의 호출, new와 invokespecial (구조 함수 호출) 로 바뀌었다.
예제
다음 Employee 클래스를 위한 객체를 작성합니다.

class Employee implements Cloneable, Serializable {
  private static final long serialVersionUID = 1L;
  private String name;
  public Employee() {
    System.out.println("Employee Constructor Called...");
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Employee other = (Employee) obj;
    if (name == null) {
      if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
      return false;
    return true;
  }
  @Override
  public String toString() {
    return "Employee [name=" + name + "]";
  }
  @Override
  public Object clone() {
    Object obj = null;
    try {
      obj = super.clone();
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return obj;
  }
}

다음 Java 프로그램에서는 5가지 방법으로 Employee 객체를 작성합니다.

public class ObjectCreation {
  public static void main(String... args) throws Exception {
    // By using new keyword
    Employee emp1 = new Employee();
    emp1.setName("Naresh");
    System.out.println(emp1 + ", hashcode : " + emp1.hashCode());
    // By using Class class's newInstance() method
    Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee")
                .newInstance();
    // Or we can simply do this
    // Employee emp2 = Employee.class.newInstance();
    emp2.setName("Rishi");
    System.out.println(emp2 + ", hashcode : " + emp2.hashCode());
    // By using Constructor class's newInstance() method
    Constructor<Employee> constructor = Employee.class.getConstructor();
    Employee emp3 = constructor.newInstance();
    emp3.setName("Yogesh");
    System.out.println(emp3 + ", hashcode : " + emp3.hashCode());
    // By using clone() method
    Employee emp4 = (Employee) emp3.clone();
    emp4.setName("Atul");
    System.out.println(emp4 + ", hashcode : " + emp4.hashCode());
    // By using Deserialization
    // Serialization
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("data.obj"));
    out.writeObject(emp4);
    out.close();
    //Deserialization
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
    Employee emp5 = (Employee) in.readObject();
    in.close();
    emp5.setName("Akash");
    System.out.println(emp5 + ", hashcode : " + emp5.hashCode());
  }
}

프로그램 출력:

Employee Constructor Called...
Employee [name=Naresh], hashcode : -1968815046
Employee Constructor Called...
Employee [name=Rishi], hashcode : 78970652
Employee Constructor Called...
Employee [name=Yogesh], hashcode : -1641292792
Employee [name=Atul], hashcode : 2051657
Employee [name=Akash], hashcode : 63313419
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기