Yazilar:

 Sponsor Reklam 


19.09.2009 (08:05)

 Java'da Reflection Kullanımı 
Java sınıfların, metotların, metotların aldıkları değer tiplerinin isimlerini çalışma zamanında (runtime) alabilmemizi sağlamaktadır. Bunun için reflect paketi import edilir. Bu işlemlere reflection denir.

Peki java reflection ne işe yarar?
Yansıtma kütüphanesine geliştirme araçları yazarken ihtiyaç duyabiliriz. Çalışma zamanında bize string olarak gelen bir değerin sınıf olarak düşünülüp nesnesinin üretilmesi gerekebilir. İşte derleme (compile) sırasında değil de çalışma (runtime) sırasında sınıf(lar)ın nesnesinin üretilmesine, onların metotlarına, tiplerine, paketlerine erişmeye yansıtma diyoruz.

Eğer derleyici yazalım dersek girilen text kodun ayrıştırılıp (parse) yazım incelemesi (syntax) yapıldıktan sonra, kodun içinde geçen nesnelerin üretilmesi ve metotların çağrılması için böyle bir mekanizmaya ihtiyaç duyarız.

Örnek bir koda bakalım:
package kodcu.net;

import java.lang.reflect.*;

public class Main {

  public static void main(String[] args) {

    // Select a class
    class.kodcu.net/" class="linked" target="_blank">Class cls = String.class;
   
    // Get methods of the class
    Method[] methodList = cls.getDeclaredMethods();

    for (int i = 0; i < methodList.length; i++) {
      Method m = methodList[i];
      System.out.println("Method Name: " + m.getName());
     
      class.kodcu.net/" class="linked" target="_blank">Class[] parameterTypes = m.getParameterTypes();
      for (int j = 0; j < parameterTypes.length; j++) {
        System.out.println("  Parameter Type: " + parameterTypes[j].getName());
      }
     
      System.out.println();
    }
   
  }

}

Imza: admin

03.07.2009 (07:09)

 Ondalıklı Sayılarda Son Basamak 
Ondalıklı sayılarda virgülden sonraki kısıma dikkat etmek gerekmektedir. double işlemlerde burada karşılaşılabilecek hatalardan dolayı bölme ve çarpma işlemlerinde öncelik çarpmaya verilmelidir. Böylece hata payı küçülmektedir.

Şimdi ondalıklı sayılardaki önceki en büyük ondalıklı sayıya ve sonraki en küçük ondalıklı sayıya bakalım:

package kodcu.net;

import java.text.ChoiceFormat;

public class Main {

  public static void main(String[] args) {
    double d = 1.3;
   
        // Largest double before d
        double d1 = ChoiceFormat.previousDouble(d);
        System.out.println(d1);
        // Smallest double after d
        double d2 = ChoiceFormat.nextDouble(d);
        System.out.println(d2);
  }

}

Çıktı şu şekildedir:
1.2999999999999998
1.3000000000000003

Imza: admin

22.06.2009 (17:56)

 Programı Sonlandırma 
Uygulamanın herhangi bir yerinde uygulamayı sonlandırmak istersek System sınıfının exit metodunu kullanabiliriz.

package kodcu.net;

public class Main {

  public static void main(String[] args) {
    int exitCode = -1;
    // return exitCode
    System.exit(exitCode);
  }

}

Bu metot çağırısı ile o an çalışmakta olan Java Virtual Machine sonlandırılır. Sıfırdan farklı bir sayı dönerse uygulamadan, normal olmayan bir sonlanma bildirilmektedir.
Imza: admin

20.06.2009 (23:57)

 String'i Bölme, Split Etme 
split() metodu, String'leri belirli ifadelere göre parçalamayı sağlar.

Şu örnekte verilen yazıyı boşluğa göre ayrıştıralım:
package kodcu.net;

public class Main {

  public static void main(String[] args) {
    String str = "www kodcu net";
    System.out.println(str);
    String[] str2 = str.split(" ");
    for (int i = 0; i < str2.length; i++) {
      System.out.println(str2[i]);
    }
  }
}

Çıktımız şu şekilde:
www kodcu net
www
kodcu
net

Görüldüğü gibi ilk ifade boşluğa göre parçalandı.

Neye göre ayrıştırma yapılacağını bir RegEx ifadesi olarak belirtiriz.

Kaça kadar ayırştırma yapılacağını ise aynı metotta ikinci parametre olarak verebiliriz. Yazdığımız kodda şöyle bir değişiklik yaparsak:
    String[] str2 = str.split(" ",2);

Şu sonucu alırız:
www kodcu net
www
kodcu net

Görüldüğü gibi yine ilk yazı ayrıştırılmasını istediğimiz yazı. Bu yazı, boşluğa göre 2 parça olacak şekilde ayrıştırma yapılmıştır.
Imza: admin

20.05.2009 (23:49)

 Timestamp'i Formatlı Halde String'e Çevirmek 
Daha önce Timestamp sınıfı ve kullanımından bahsetmiştik. Çokça ihtiyaç duyulan tarhisel işlemlerden birisi olan tarihsel veri içeren String'in Timestamp hale dönüştürülmesinden şurada bahsetmiştik. Bunun tam tersi de yine ihtiyaç duyulan işlemlerden birisi. Şimdi Timestamp verinin belirli bir formatta istediğimiz String hale dönüştürülmesine bakalım:

package kodcu.net;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.sql.Timestamp;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) throws Exception {
   
    String pattern = "dd/MM/yyyy HH:mm";
   
    Date dt = new Date();
    Timestamp ts = new Timestamp(dt.getTime());
   
    SimpleDateFormat formatter = new SimpleDateFormat(pattern);
    String strDate = formatter.format(new Date(ts.getTime()));
   
    // This is timestamp
    System.out.println(ts);
    // This is formatted date
    System.out.println(strDate);

  }

}

Ekran çıktısı şu şekildedir:
2009-05-20 16:44:52.0
20/05/2009 16:44

Birinci veri timestamp, ikincisi ise bizim formatlı tarihimiz.
Imza: admin

18.05.2009 (00:23)

 Hex String Integer Dönüşümleri 
Hex String - Integer dönüşümlerine yerine göre ihtiyaç duyabiliriz. Bununla ilgili şu örneğe bakabilirsiniz:

package kodcu.net;

import java.awt.Color;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) throws Exception {

  String strHex = "FFFFFF";
  int intValue = Integer.parseInt(strHex, 16);
  System.out.println("This is integer value: " + intValue);
  strHex = Integer.toHexString(intValue);
  System.out.println("This is hex string: " + strHex); 
 
  Color color = new Color(intValue);
  // Color color = new Color(0xFFFFFF);
  int red = color.getRed();
  int green = color.getGreen();
  int blue = color.getBlue();
  System.out.println("RGB: " + red + " " + green + " " + blue); 
 
  }

}

Burada awt çatısı kullanılmıştır ve Color sınıfının nesnesi rengimiz oluşturulurken integer değer verilmiştir. Bu değere göre kırmızı (red), yeşil (green) ve mavi (blue) RGB değerleri elde edilmiştir.

Ekran çıktısı şu şekildedir:
This is integer value: 16777215
This is hex string: ffffff
RGB: 255 255 255

Imza: admin

16.05.2009 (00:04)

 Thread Sınıfı ve Kullanımı 
Thread'ler çok kanallı programlama (multiprogramming, multitasking) için önemli bir mekanizmadır. Java'nın da desteklediği bu sınıf aynı anda birden fazla iş yapabilmemizi ya da başka değişle farklı iş parçacıklarının aynı zamanda çalışmasını sağlamaktadır.

Thread'ler process'lerle karıştırılmamalıdır. Bir process'te birden fazla thread çalışırken ve bunların çalışmaları programlanırken (scheduling) işletim sistemine göre aynı anda birden fazla process çalışmayabilir (multiprocessing). Bu o işletim sisteminin yeteneği ile ve CPU (işlemci) sayısının birden fazla olması ile ilgilidir.

Şimdi bu sınıfın kullanımına bakalım. Kendi thread sınıflarımızı oluşturmak için sınıf oluşturduktan sonra Thread sınıfını genişletiriz (extend). Yapcağımız işlemleri kendi sınıfımızda run() metodu oluşturarak içinde yaparız. Bu kanal çalıştırılacağı zaman start() metodu çağırılır.

Şu örneğe bakalım:

Main.java:
package kodcu.net;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) {

    ThreadDemo td1 = new ThreadDemo(1);
    ThreadDemo td2 = new ThreadDemo(2);
    ThreadDemo td3 = new ThreadDemo(3);
   
    td1.start();
    td2.start();
    td3.start();
   
  }

}

ThreadDemo.java:
package kodcu.net;

public class ThreadDemo extends Thread {
  private int id;
  public ThreadDemo(int id) {
    this.id = id;
  }

  public void run() {
   
    for (int i = 0; i < 10; i++) {
      System.out.println("Thread ID: " + id + " Number: " + i);
    }

  }
}

Ekran çıktısı şu şekildedir:
Thread ID: 2 Number: 0
Thread ID: 2 Number: 1
Thread ID: 2 Number: 2
Thread ID: 2 Number: 3
Thread ID: 2 Number: 4
Thread ID: 2 Number: 5
Thread ID: 2 Number: 6
Thread ID: 2 Number: 7
Thread ID: 2 Number: 8
Thread ID: 2 Number: 9
Thread ID: 1 Number: 0
Thread ID: 1 Number: 1
Thread ID: 1 Number: 2
Thread ID: 3 Number: 0
Thread ID: 1 Number: 3
Thread ID: 3 Number: 1
Thread ID: 1 Number: 4
Thread ID: 3 Number: 2
Thread ID: 1 Number: 5
Thread ID: 3 Number: 3
Thread ID: 1 Number: 6
Thread ID: 3 Number: 4
Thread ID: 1 Number: 7
Thread ID: 1 Number: 8
Thread ID: 1 Number: 9
Thread ID: 3 Number: 5
Thread ID: 3 Number: 6
Thread ID: 3 Number: 7
Thread ID: 3 Number: 8
Thread ID: 3 Number: 9

Görüldüğü gibi kanal kendi içerisinde sıralı çalışırken hangi kanalın önce davranacağı konusu belirli değildir. Kanalların aynı anda çalışma mantığı bunu gerektirir. Önemli olan verilen zaman içerisinde bu kanalların birlikte koşmasıdır (run).

Bir kanalın ayakta olup olmadığını isAlive() metodu ile öğrenmekteyiz. Kanalın uyumasını sleep(long) metodu ile sağlarız. Kanal içerisinde de Thread.sleep(long) metodu ile sağlayabiliriz.

Kanalı oluşturup istediğimiz zaman çalışmasını istersek şöyle bir yol izleyebiliriz. Burada kanala yapılan metod çağrılarında sıralı işlem yapılması için synchronized anahtar kelimesini (keyword) kullanacağız.

    public synchronized void run() {
        while (true) {
            try {
                wait();
            } catch (InterruptedException ie) {
                // ie
                //System.out.println("InterruptedException");
            }
            connect();
        }
    }
   
    public synchronized void go() {
        notify();
    }

    private void connect() {
        // işlemler
    }

Burada da wait() metodu ve notify() metodunu görüyoruz. Bu metotlar Object sınıfının metotlarıdır ve kanalı wait() ile beklemeye alırız notify() ile uyandırırız.

Kanalların çalışma anları için öncelik verebiliriz. Bunu da Thread sınıfının setPriority(int) metodu ile sağlarız. Öncelik değerleri 0-10 arasındadır ve bunla ilgili tanımlı bazı sabitler şunlar:
Thread.MIN_PRIORITY =1
Thread.NORM_PRIORITY =5
Thread.MAX_PRIORITY=10

Çok fazla kanalla çalışırken boşta duran kanalın işgalini önlemek için yield() metodunu kullanmaktayız. Bekleme sırasında yüksek veya eşit önceliğe sahip kanalların çalışmasına izin verir.

join() metodu, kanalın belirli süre veya ölene kadar beklemesini sağlar.

interrupt() metodu wait halindeki veya sleep halinde de olabilen kanalın uyandırılmasını (kesme işlemini) sağlamaktadır. Kanalın kesme durumunda olup olmadığı da isInterrupted() metodu ile öğrenilmektedir.

Kanalı öldürmek için stop() veya destroy() metotları kullanılmaktadır.
Imza: admin

06.05.2009 (05:32)

 Properties Sınıfı ve Kullanımı 
Properties sınıfı java.util çatısı altında yer alan bir sınıftır. Belirli anahtarlara (keys) karşılık belirli değerlerin (values) eşleşmesini sağlamaktadır. Bu eşleşme daha önce şu yazıda bahsettiğimiz Hashtable sınıfındaki anahtar-değer (key-value) eşleşmesine benzemektedir.

Peki Hashtable ile Properties sınıflarının farkı nedir?

Hashtable'da anahtar ve değer çiftimiz Object tipinde iken Properties sınıfında anahtar ve değer çiftimiz String tipindedir. Örnek olarak Hashtable'da bir string değerine karşılık bir nesne ekleyebiliyorken Properties'te string'e karşılık sadece string tutabiliyoruz.

Bundan anlaşıldığı gibi Properties sınıfı daha özel bir sınıftır ve Hashtable'ı bu amaçla genişletir (extend).

Properties kullanımına yönelik şu örneğe bakalım:

package kodcu.net;

import java.util.Properties;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) {
    Properties dbFieldProp = new Properties();
    dbFieldProp.put("id", "USER_ID");
    dbFieldProp.put("username", "USER_NAME");
    dbFieldProp.put("password", "USER_PASSWORD");
    dbFieldProp.put("email", "USER_EMAIL");

    System.out.println(dbFieldProp.getProperty("email"));
  }

}

Programın çıktısı şu şekildedir:
USER_EMAIL

getProperty() metodu ile değer okuması yapılmaktadır.

Örnekte veritabanı alanları değerler olarak düşünülmüştür ve bunlara erişmede kullanılacak kelimeler de anahtar kelimelerdir.
Imza: admin

01.05.2009 (00:39)

 Dosyadan Tamponlu Okuma Yapma 
Karakter karakter veya satır satır okuma ile ilgili daha önce burada ve şurada değinmiştik.

Bunların dışında tamponlu yani buffer kullanarak okuma nasıl yapılır ona bakalım.

Tamponlu okumada bir byte dizimiz mevcuttur ve her okuma anında bu byte dizisi kadar veri okunur.

Örnek:
package kodcu.net;

import java.io.*;

public class Main {

  public static final int BUFFER_SIZE = 20;

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      FileInputStream fis = new FileInputStream(file);
      int c;

      byte[] dizi = new byte[BUFFER_SIZE];
      int len = 0;
      while ((len = fis.read(dizi, 0, BUFFER_SIZE)) == BUFFER_SIZE) {
        System.out.print(new String(dizi));
      }
      if (len != -1) {
        byte[] kalan = new byte[len];
        for (int i = 0; i < len; i++) {
          kalan[i] = dizi[i]; // last part
        }
        System.out.print(new String(kalan));
      }

      fis.close();
    }
    catch (FileNotFoundException fnfe) { }
    catch (IOException ioe) { }
  }

}

Imza: admin

23.04.2009 (06:19)

 Collections Sınıfı ile Hashtable-Vector Sıralama 
Hashtable kullanımında anahtar ve değerleri gezmek için Enumeration'dan ve Iterator'den bahsetmiştik. Bu verileri yazdırırken farklı sırada geldiğini görürüz:

Hashtable h = new Hashtable();
h.put("1","Türkiye");
h.put("2", "England");
h.put("3", "Deutsch");

// Use enumeration
Enumeration e = h.keys();
while (e.hasMoreElements()) {
  System.out.println(e.nextElement());
}

// Use enumeration
e = h.elements();
while (e.hasMoreElements()) {
  System.out.println(e.nextElement());
}

// Use iterator
Set s = h.keySet();
Iterator i = s.iterator();
while (i.hasNext()) {
  System.out.println(i.next());     
}

// Use vector
Vector v = new Vector(h.keySet());
for (int j = 0; j < v.size(); j++) {
  System.out.println(v.elementAt(j)); 
}

Burada ekran çıktısı şu şekildedir:
3
2
1
Deutsch
England
Türkiye
3
2
1
3
2
1

3-2-1 şeklinde elde ettik elemanlarımızı. Sıralı bir şekilde almak istersek Collections sınıfınının sort() metodunu kullanabiliriz:

// Use collections
v = new Vector(h.keySet());
Collections.sort(v);
for (int j = 0; j < v.size(); j++) {
  System.out.println(v.elementAt(j)); 
}

Imza: admin

 1   2   3  ··  10 








Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter