2016-04-12 8 views
0

this stackoverflow postaını kontrol ettim. Ama hala anlamadım.JDK proxy'si proxy örneği, Invocation işleyicisine nasıl aktarılır?

JDK proxy'sinde Proxy.newInstance (arg1, arg2, arg3) yeni proxy örneğini oluşturur. Bu proxy örneğinde bir yöntem çağırdığımızda, onun ilgili çağrı işleyicisini çağırır. Çağırma işleyicisinin çağırma yöntemi, çağrıyı gerçek yönteme delege eder.

Çağırma yönteminin 3 bağımsız değişkeni vardır. İlki, çağrının yapıldığı proxy örneğinden bahsedilmektedir. Şüphem, proxy örneğinin, çağırma işleyicisi yöntemine nasıl iletildiğidir?

Şüphelerimi daha net anlamak için, lütfen aşağıdaki koduma bakın.

Arayüz

package proxyclasses; 

public interface Animal { 
    public abstract void eat(String food); 
} 

Beton Sınıfı

paket proxyclasses;

public class Cow implements Animal { 

    public void eat(String food) { 
     System.out.println("Cow eats "+food); 
    } 

} 

Vekil Sınıf

package proxy; 

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 

public class MyInvocationHandler implements InvocationHandler { 

    private Object target; 

    public MyInvocationHandler(Object target) { 
     this.target = target; 
    } 
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable { 
     System.out.println("Proxy "+proxy.getClass().getName()); 
     Object result = method.invoke(target, args); 
     return result; 
    } 

} 

Ana Sınıfı

İşte
import java.lang.reflect.Proxy; 

import proxy.MyInvocationHandler; 
import proxyclasses.Animal; 
import proxyclasses.Cow; 


public class ProxyExample { 
    public static void main(String args[]){ 
     Cow cow = new Cow(); 
     Animal proxInstance = (Animal)Proxy.newProxyInstance(Cow.class.getClassLoader(),Cow.class.getInterfaces(),new MyInvocationHandler(cow)); 
     proxInstance.eat("Grass"); 
    } 
} 

benim şüphe ana sınıfında 'proxInstance' yöntemini çağırmak myInvocationHandlers geçirilir nasıl?

+0

Sana bir referans bir yöntem çağrısı geçirilir anlamak, farz, bu yüzden soruyorsun ne anlamıyorum. –

cevap

0

Burada benim ana şüphe 'proxInstance' myInvocationHandlers yöntemine nasıl geçirilir?

Kendi soru cevap var gibi görünmektedir. Bu vekil örneğinde bir yöntemi çağırdığınızda

o ilişkili çağırma işleyicisi çağırır

Yani var this sarar Vekil nesnesidir

Method method = ... 
Object[] args = ... 
handler.invoke(this, method, args); 

gibi bir şey işleyici Aradın vekil. proxy'leri anlama beri

+0

vekil örneği tarafından yöntem çağrısı kendisini geçer Nasıl işleyicisi çağırma için? –

İlgili konular