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]


bir programlama dili ne kadar karmaşık olabilir ki?

Tuesday, September 12, 2006 6:18:00 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

ANTLR'ı yazan çılgın profösör [[http://www.cs.usfca.edu/~parrt/|Terrence PARR]]'ın ANTLRWORKS adlı yazılımını kurcalarken Java'nın BNF söz dizim kurallarını grafiğe dönüştürmek aklıma geldi. Gözüm korktu mu? Galiba korktu :)

eğlencelik, javakaynak | yorumlar [0]


sütlü kahve

Tuesday, September 5, 2006 10:37:00 PM tarihinde Fırat KÜÇÜK tarafından gönderildi.

Javy, nam-ı diğer sütlü kahve eski adıyla ise c-star!

Javy Projesi, Java platformunda daha kolay öğrenebilen daha az kod ile daha çok iş yapabilen bir dil olmayı hedefliyor. Benzer amaçla daha önceden yola çıkmış olan |Groovy projesi bulunmakta. Fakat Groovy'nin benzer projelerden farklılığı lexer ve parserının el ile yazılmış olması. Javy'nin kodlamasına başlarken, Jython projesinde kullanılan JavaCC ile Boo projesinde kullanılan Antlr arasında kararsız kaldık! JavaCC'ın çalışma zamanı bağımlılığı bulunmaması en büyük artısı fakat Antlr'ın 3 defa baştan yazılmış olması ve ANTLRWorks gibi harika araçlar ile bezenmesi kalbimizi fethetmeye yetti. :)

Bu projeye başlarken ben Fırat KÜÇÜK, saz arkadaşlarım Yılmaz UĞURLU ve Cafer ŞİMŞEK'i sürekli rahatsız etmeye devam ediyorum. :) Bu güzide arkadaşların yanında eskiden c-star projesinden desteklerini esirgemeyen sevgili kardeşim Ersin ARSLAN'a da teşekkür ederim.

Evet, sütlü kahve pişmeye başlıyor. Herkesin desteklerini bekliyoruz. En azından yeni bir dilde bulunmasını istediğiniz özellikleri bize iletebilirsiniz.

haber, java, javykaynak | yorumlar [5]




1


pengulog

her hakkı erkektir © 2008 e-posta