import java.lang.reflect.Method;

class Kalkulator {
    public static int tambah(int a, int b) {
        return a + b;
    }
}

public class StrukturBiaya {
    public static void main(String[] args) throws Exception {
        // Bukti 1: hasil pencarian tidak di-cache JVM — setiap getMethod membuat salinan
        Method m1 = Kalkulator.class.getMethod("tambah", int.class, int.class);
        Method m2 = Kalkulator.class.getMethod("tambah", int.class, int.class);
        System.out.println("Hasil pencarian sama (equals)? " + m1.equals(m2));
        System.out.println("Objek yang sama (==)?          " + (m1 == m2));

        // Bukti 2: argument primitif wajib dibungkus (boxing) ke Object[]
        Method tambah = Kalkulator.class.getMethod("tambah", int.class, int.class);
        tambah.setAccessible(true);
        Object[] argumen = {2, 3};
        System.out.println("Tipe argumen[0]: " + argumen[0].getClass().getSimpleName());

        Object hasil = tambah.invoke(null, argumen);
        System.out.println("Tipe kembalian : " + hasil.getClass().getSimpleName());
        System.out.println("Hasil          : " + hasil);
    }
}
