import java.lang.annotation.*;
import java.lang.reflect.Field;
import java.util.Arrays;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Entitas {
    String tabel();                    // elemen wajib: tanpa nilai bawaan
    String skema() default "publik";   // elemen opsional: punya nilai bawaan
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Kolom {
    String nama();
    boolean wajib() default false;
    String[] indeks() default {};      // elemen array dengan bawaan kosong
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Diaudit {}                  // marker: tanpa elemen sama sekali

@Entitas(tabel = "pelanggan")
@Diaudit
class Pelanggan {
    @Kolom(nama = "id", wajib = true, indeks = {"unik"})
    public int id;

    @Kolom(nama = "nama_lengkap")
    public String namaLengkap;
}

public class ContohAnotasiKustom {
    public static void main(String[] args) {
        Entitas e = Pelanggan.class.getAnnotation(Entitas.class);
        System.out.println("Tabel : " + e.tabel());
        System.out.println("Skema : " + e.skema());

        Field[] field = Pelanggan.class.getDeclaredFields();
        for (Field f : field) {
            Kolom k = f.getAnnotation(Kolom.class);
            System.out.println(f.getName() + " -> kolom=" + k.nama()
                    + ", wajib=" + k.wajib()
                    + ", indeks=" + Arrays.toString(k.indeks()));
        }
        System.out.println("Diaudit? " + (Pelanggan.class.getAnnotation(Diaudit.class) != null));
    }
}
