Dwr kodu genel bir yere konup birden fazla developer'a açıldığında, production release'lerde versiyon ayarlaması büyük çaba istiyor. Birçok dosyada aynı sorun yaşanabiliyor. Ama bu durum için bir çözüm üretilebilir.
O nedenle, dwr metodlarını tuttuğum class içinden çağrılan tüm static metodları reflection ile çağırmayı uygun buldum. Böylece, productiona henüz çıkmamış kodları kullanan yeni metodların dwr class'ı içinde productiona alınmasında bir sorun olmayacaktı.
Bunun için ilgili static metodları reflection ile çağırmak için kullanılacak metodun içini yazıyorum.
Class temp = Class.forName(className);
Method method1 = temp.getMethod(methodName1, parameterTypes);
return method1.invoke(temp, parameters);
className olarak metodun bulunduğu class ismini veriyorum. Aynı dizinde olsa bile className'i tüm package ismiyle vermemiz gerekiyor. Yoksa classnotfound hatası alınıyor.
methodName olarak, çağıracağım metodun ismini veriyorum. getMethod'a gönderilen ikinci parametre de çağrılacak metodun aldığı parametrelerin bir class array içine konulmuş hali.
Bir örnek olarak:
Class[] parameterTypes = { String.class, String.class};
invoke'u çağırırken de bu parametrelere denk gelen değerleri bir object array içinde ikinci parametre olarak yolluyorum.
Buna da bir örnek olarak:
Object[] parameters = { "111", "222"};
Yukarıda yazmış olduğum reflection metodu, verilen class ve metod ismiyle bir static metod arayacağı için reflection ile çağrılacak olan metod eğer static tanımlanmamışsa aşağıdaki gibi bir hatayla karşılaşılabilir:
java.lang.IllegalArgumentException: object is not an instance of declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
O nedenle, reflection ile yukarıdaki gibi çağrılacak olan metodun static olarak tanımlanması gerekiyor.
Non-static bir metodun çağrılması için class'ın bir instance'ını oluşturmak gerekir. Onu da not düşelim:
Class temp = Class.forName(className);
Object obj = temp.newInstance();
Method method1 = temp.getMethod(methodName1, parameterTypes);
result = method1.invoke(obj, parameters);
Bu ortak class'ın içine metod ekleneceği zaman reflection ile dallanma sağlandığı sürece versiyonlamada bir problem yaşanmayacaktır. En azından öyle ümit ediyorum.
Hakkımda
- Mahir Tarlan
- Istanbul, TR
Thursday, 18 October 2007
java reflection notlar
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment