0Pricing
Java Academy · Ders

InvocationHandler ile Dinamik Vekiller

Günlük kaydı, önbelleğe alma ve yeniden deneme amacıyla arayüz yöntem çağrılarını yakalamak üzere JDK dinamik vekilleri oluşturun.

InvocationHandler ile Dinamik Vekiller, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Dinamik Vekil Nedir?

JDK dinamik vekili, çalışma zamanında oluşturulan ve bir veya daha fazla arayüzü uygulayan bir nesnedir. Tüm metot çağrıları, sağladığınız bir InvocationHandler'a yönlendirilir.

Proxy.newProxyInstance ile Vekil Oluşturma

Bir vekil oluşturmak için Proxy.newProxyInstance(classLoader, interfaces[], handler) çağrısını yapın. Vekil, listelenen tüm arayüzleri uygular.

UserService proxy = (UserService) Proxy.newProxyInstance(
    UserService.class.getClassLoader(),
    new Class[]{UserService.class},
    new LoggingHandler(realService)
);
proxy.findById(42L); // intercepted by LoggingHandler

InvocationHandler Arayüzü

Her metot çağrısını işlemek için InvocationHandler uygulayın. İşleyici, vekil nesnesini, çağrılan metodu ve bağımsız değişkenleri alır.

public class LoggingHandler implements InvocationHandler {
    private final Object target;
    public LoggingHandler(Object target) { this.target = target; }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(">> " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("<< " + method.getName());
        return result;
    }
}

Önbellekleme İçin Vekil

Bir InvocationHandler sonuçları önbelleğe alabilir: önbellek bağımsız değişkenler için bir sonuç içeriyorsa onu döndürür; aksi takdirde gerçek metodu çağırır ve sonucu kaydeder.

public class CachingHandler implements InvocationHandler {
    private final Object target;
    private final Map<String, Object> cache = new HashMap<>();
    public CachingHandler(Object target) { this.target = target; }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String key = method.getName() + Arrays.toString(args);
        return cache.computeIfAbsent(key, k -> {
            try { return method.invoke(target, args); }
            catch (Exception e) { throw new RuntimeException(e); }
        });
    }
}

Yeniden Deneme Mantığı İçin Vekil

Metot çağrılarını bir yeniden deneme döngüsüne sarın. Bir istisna oluşursa yeniden fırlatmadan önce en fazla N kez deneyin.

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    for (int attempt = 1; attempt <= 3; attempt++) {
        try { return method.invoke(target, args); }
        catch (InvocationTargetException e) {
            if (attempt == 3) throw e.getCause();
            Thread.sleep(1000L * attempt);
        }
    }
    throw new RuntimeException("unreachable");
}

İşlem Yönetimi İçin Vekil

Spring'in @Transactional kullanımı, bir metot çağrısından önce işlemi başlatmak ve sonrasında işlemi onaylamak veya geri almak için dinamik bir vekil kullanır — tüm bunlar çağıran tarafın bilgisi olmadan gerçekleşir.

Bir Nesnenin Vekil Olup Olmadığını Kontrol Etme

Vekilleri algılamak için Proxy.isProxyClass(obj.getClass()), işleyiciyi almak için Proxy.getInvocationHandler(proxy) kullanın.

if (Proxy.isProxyClass(service.getClass())) {
    InvocationHandler h = Proxy.getInvocationHandler(service);
    System.out.println("Handler: " + h.getClass().getSimpleName());
}

JDK Dinamik Vekillerinin Sınırlamaları

JDK dinamik vekilleri yalnızca arayüzlerle çalışır — somut sınıflar için vekil oluşturamazlar. Sınıf tabanlı vekilleme için CGLIB kullanın (Spring bunu @Configuration sınıfları için dahili olarak da kullanır).

Alternatif Olarak CGLIB

CGLIB, çalışma zamanında hedef sınıfın bir alt sınıfını oluşturur ve final olmayan tüm metotları geçersiz kılar. Spring, arayüz bulunmadığında bunu kullanır. Ek açıklama gerekmez — işlem şeffaftır.

Hibernate'de Vekil Kullanımı

Hibernate, varlık ilişkilerini CGLIB/Byte Buddy vekillerini kullanarak geç yükler. Geç yüklenen bir koleksiyona eriştiğinizde vekil bir SQL sorgusu çalıştırır.

// Hibernate creates a proxy for:
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
// Accessing dept triggers a DB query via the proxy

Vekillerin Performansı

Dinamik vekil metot dağıtımı, doğrudan çağrıdan yaklaşık 5–10 kat daha yavaştır. Çok yoğun kullanılan yollar için dinamik vekiller yerine derleme zamanı kod üretimini (APT) veya MethodHandles'ı değerlendirin.

Kısa Kontrol

JDK dinamik vekillerinin temel sınırlaması nedir?

Özet

JDK dinamik vekilleri, arayüz metot çağrılarını InvocationHandler aracılığıyla keser. Günlükleme, önbellekleme, yeniden deneme ve işlem yönetimi için kullanın. Sınıf vekillemesi için CGLIB kullanın. Vekil oluşturmayı önbelleğe alın — bu işlem yansımaya dayanır ve ücretsiz değildir.

Sıkça Sorulan Sorular

“InvocationHandler ile Dinamik Vekiller” dersi ücretsiz mi?

Evet — “InvocationHandler ile Dinamik Vekiller” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“InvocationHandler ile Dinamik Vekiller” dersinde ne öğreneceğim?

Günlük kaydı, önbelleğe alma ve yeniden deneme amacıyla arayüz yöntem çağrılarını yakalamak üzere JDK dinamik vekilleri oluşturun. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“InvocationHandler ile Dinamik Vekiller” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Yansıtma ile Sınıf İnceleme
  2. Yöntemleri Çağırma ve Alanlara Erişme
  3. InvocationHandler ile Dinamik Vekiller
  4. Yansıtma Performansı ve Alternatifleri
← Java Academy Sayfasına Dön