SORU
20 Temmuz 2010, Salı


Alternatifleri java için.lang.yansıtır.Soyut sınıf oluşturma vekiller için Proxy (arayüzleri yerine)

16* *göre:

[java.lang.reflect.]Proxy statik yöntemler sağlar ve dinamik proxy sınıfları oluşturma örnekleri de vardır üst sınıf tüm dinamik proxy sınıflar bu yöntemleri tarafından oluşturulan.

newProxyMethod method () dinamik vekiller oluşturmaktan sorumlu olan aşağıdaki imzası vardır:

public static Object newProxyInstance(ClassLoader loader,
                                      Class<?>[] interfaces,
                                      InvocationHandler h)
                             throws IllegalArgumentException

Ne yazık ki, bu dinamik bir proxy üreten birer engeluzanırbelirli soyut bir sınıf (yerineuygulamabelirli arabirimleri). Bu anlamda, java.lang.reflect.Proxy düşünürsek "tüm dinamik vekiller üst sınıf", böylece önlenmesi, üst sınıf. olmaktan başka bir sınıf yapar

Bu nedenle, dinamik bir yakınlık oluşturabilir java.lang.reflect.Proxy başka alternatif vardevralırbelirli soyut bir sınıftan, yönlendirme, tüm aramalarÖzetçağrı işleyicisi için yöntemler?

Örneğin, soyut bir sınıf olduğunu varsayalım Dog:

public abstract class Dog {

    public void bark() {
        System.out.println("Woof!");
    }

    public abstract void fetch();

}

Bana aşağıdakileri yapmak için izin veren bir sınıf var mı?

Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h);

dog.fetch(); // Will be handled by the invocation handler
dog.bark();  // Will NOT be handled by the invocation handler

CEVAP
20 Temmuz 2010, Salı


Javassist (ProxyFactory) kullanarak veya CGLIB yapılabilir.

Adem örnek Javassist kullanarak:

Ben (Adam Paynter) bu kodu kullanarak Javassist yazdı:

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Dog.class);
factory.setFilter(
    new MethodFilter() {
        @Override
        public boolean isHandled(Method method) {
            return Modifier.isAbstract(method.getModifiers());
        }
    }
);

MethodHandler handler = new MethodHandler() {
    @Override
    public Object invoke(Object self, Method thisMethod, Method proceed, Object[] args) throws Throwable {
        System.out.println("Handling "   thisMethod   " via the method handler");
        return null;
    }
};

Dog dog = (Dog) factory.create(new Class<?>[0], new Object[0], handler);
dog.bark();
dog.fetch();

Bu çıktıyı üretir:

Woof!
Handling public abstract void mock.Dog.fetch() via the method handler

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joseph Herscher

    Joseph Hersc

    14 Mart 2007
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005
  • Willie D.

    Willie D.

    16 Aralık 2006