Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 VarHandle 인스턴스를 생성하는 방법

VarHandle이란?

VarHandle(변수 핸들)은 변수에 대한 타입이 지정된 참조(reference)를 의미합니다. 참조 대상은 배열 요소, 클래스의 인스턴스 필드 또는 정적(static) 필드가 될 수 있습니다. VarHandle 클래스는 특정 조건 하에서 변수에 대한 읽기 및 쓰기 접근을 제공하며, 불변(immutable) 객체로서 별도의 가시성 상태를 갖지 않습니다. 또한 상속을 통해 서브클래스를 만들 수 없고, 각 VarHandle은 해당 핸들이 나타내는 변수의 타입을 나타내는 제네릭 타입 T를 가집니다.

VarHandle의 주요 목적은 필드와 배열 요소에 대해 java.util.concurrent.atomic 패키지 및 sun.misc.Unsafe 클래스에서 제공하던 연산과 동일한 기능을 호출할 수 있는 표준 방식을 정의하는 것입니다. 이를 통해 기존에 Unsafe API에 의존하던 저수준 메모리 연산을 더 안전하고 표준화된 방법으로 수행할 수 있습니다.

VarHandle 인스턴스 생성하기

VarHandle 인스턴스는 MethodHandles.lookup() 메서드를 통해 얻은 Lookup 객체를 사용하여 생성할 수 있습니다. 아래 예제에서는 findVarHandle() 메서드를 사용해 Student 클래스의 studentId 필드에 대한 VarHandle을 만듭니다.

예제 코드

import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;

public class VarHandleInstanceTest {
    public static void main(String args[]) {
        try {
            VarHandle fieldHandle = MethodHandles.lookup().in(Student.class)
                    .findVarHandle(Student.class, "studentId", int.class);
            System.out.println("VarHandle 인스턴스가 성공적으로 생성되었습니다!!!");
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

// Student 클래스
class Student {
    protected int studentId;
    private String[] marks;
    public Student() {
        studentId = 0;
        marks = new String[] {"75", "85", "95"};
    }
}

실행 결과

VarHandle 인스턴스가 성공적으로 생성되었습니다!!!

코드 설명

MethodHandles.lookup()은 현재 실행 중인 클래스의 접근 권한을 기반으로 Lookup 객체를 반환합니다. 여기에 .in(Student.class)를 호출하여 조회 대상 클래스를 지정한 후, findVarHandle() 메서드에 클래스 타입, 필드 이름, 필드 타입을 순서대로 전달하면 해당 필드에 대한 VarHandle이 반환됩니다.

만약 지정한 이름의 필드가 존재하지 않으면 NoSuchFieldException이 발생하고, 접근 권한이 없으면 IllegalAccessException이 발생하므로 예외 처리가 필요합니다.