pengeunpedi pengeunpedi pengeunpedi
  penguenyuvasi   pengulog   arşiv   bulut   rss

java'da devingen tip değişimi

Friday, September 22, 2006 8:54:00 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

Dynamic type casting with dynamic method invocation in Java

Javy için iki gündür uğraştığım; saçlarımın döküldüğü hususu sonunda netliğe kavuşturdum. Yılmaz'ın ve Cafer'in başını oldukça ağrıttım ama sonunda çözdük. Üstad cafer, kayyo.net'e yapılan DoS saldırısını defetmekle uğraşıordu. Multithread (Çok kanallı) çalışan sevgili arkadaşım okadar işine rağmen yardım etmeye çalıştı teşekkür ediyorum kendisine :)

Lakin jenerik tip tanımı yapamadığımdan ve durağan tip değişimi de (static casting / Explicit type conversion) yapamadığımdan dolayı (kullandığım lexer buna imkan vermiyordu.) işler baya sıkıntıya girdi. Aslında Java'yı yapan amcamlar. İşleri biraz yokuşa sürmüş. Mesela;

public class Deneme {
    public static void main(String[] args) {
        Object  A = new Integer(45);
        Integer B = (Integer) A;
    }
}

Bu bir durağan tip değiştirme örneği fakat A'nesnesi Object olarak bir işlevden dönüyor ve A'nın Integer'mı String'mi olduğunu bilmiyorsak ne yapmamız gerekiyor? Örnek bir deneme yapalım;

public class Deneme {
    public static void main(String[] args) {
        Object  A        = new Integer(45);

        // A'nın hangi sınıfın örneklendirilmiş nesnesi olduğunu
        // bilmediğimizi fazedelim. 
        // A'ya ait sınıfı A.getClass() ile çalışma zamanında alıp
  
        Class  className = A.getClass();
        Integer B = (className) A;

        // Devingen tip değiştirimi yapmasını beklerdim. Ama olmadı :(

    }
}

Yukarıdaki kod PHP veya Python gibi esnek bir dil kullansaydınız çalışabilirdi. Ama Java affetmez. className adında bir sınıf olmadığından dolayı. Kodumuz çalışmayacaktır. Uzun araştırmalar sonucunda L'oreal laboratuarları nutri seranidli şampuan yaparken biz de boş durmadık tabi. Devingen metod çağırımı sayesinde bu işi yapacağımızı düşündük;

import java.lang.reflect.*;

public class DynamicCasting {

    public static void main(String[] args) {

        DynamicCasting d = new DynamicCasting();
        Object         a = d.literal("String", "4");
        Object         b = d.literal("String", "5");


        // dynamic casting

        String    result         = null;
        Class     c              = DynamicCasting.class;
        Class[]   parameterTypes = new Class[] {a.getClass(), b.getClass()};
        Method    plusMethod;
        Object[]  arguments      = new Object[] {a, b};

        try {
            plusMethod = c.getMethod("plus", parameterTypes);
            System.out.println(plusMethod.invoke(d, arguments));
        } catch (NoSuchMethodException e) {
            System.out.println(e);
        } catch (IllegalAccessException e) {
            System.out.println(e);
        } catch (InvocationTargetException e) {
            System.out.println(e);
        } catch (IllegalArgumentException e) {
            System.out.println(e);
        }

    }

    public Object literal(String t, String v) {

        if (t == "Byte") {
            return Byte.valueOf(v);
        } else if (t == "Short") {
            return Short.valueOf(v);
        } else if (t == "Long") {
            return Long.valueOf(v);
        } else if (t == "Integer") {
            return Integer.valueOf(v);
        } else { // String
            return v;
        }

    }


    // polymorphism yapılacak

    public Integer plus(Integer a, Integer b) {
        return new Integer(Integer.valueOf(a) + Integer.valueOf(b));
    }

    public String plus(String a, String b) {
        return a + b;
    }

}

Yukarıdaki kod kendi sınıfına ait plus metodunu polymorphism kullanarak seçiyor. Fakat bunun için Object tanımından kurtulup String veya Integer olmaları gerekli. Ama bu çevrime gerek duymadan invoke metodunun nev-i şahsına münhasır yapısı sayesinde Object dizisi olarak parametre yolluyoruz. Umarım merak edenlerin işine yaramıştır. :)

atölye, javakaynak | yorumlar [0]
 
ilişkili gönderiler:

delicious | digg | reddit | magnoliacom | furl | google | yahoo






pengulog

her hakkı erkektir © 2008 e-posta