Javada Disassembler ve Decompiler İşlemleri

Java ile yazılan uygulamalar bilindiği gibi .java uzantılı kaynak dosyalara sahiptir.

Uygulamayı çalıştırabilmek için ise, öncelikle Java derleyicisi (compiler) ile bu kaynak dosyaları JVM (Java Virtual Machine) nin anlayacağı bytecode lara derlememiz gerekiyor. Bytecode, .java uzantılı kaynak dosyaların JVM üzerinde çalıştırılabilir formu olan ve .class uzantılı Java dosyalarıdır.

Elimizdeki .class uzantılı dosyaları Java platformunun sunduğu araçları kullanarak, kaynak dosyadaki bileşenlere ayrıştırılmış halini elde edebiliyoruz. Bu işleme disassemble adı veriliyor.

Daha da önemli ve ilginç olanı ise, .class uzantılı derlenmiş bytecodeları, ek birtakım araçlar kullanarak tekrar kaynak dosya biçimine çevirebiliyoruz. Bu işleme de decompile adı veriliyor.

Bu yazıda bu iki işlemin Javada nasıl yapıldığını anlatmaya çalışıcam. Öncelikle konuyu örnekler üzerinden ele alacağım için, Test.java adında basit bir Java uygulaması yazalım. Decompiler ve Disassembler işlemlerini bu kaynak dosya üzerinde örneklendirmeye çalışıcaz.

Devam »

Java ile Twitter Bağlantısı

Java uygulamalarınız içerisinde, Twitter ile etkileşime geçmek için JTwitter adında güzel bir API geliştirilmiş. JTwitter open source (açık kaynak) bir kütüphane ve LGPL license altında yayınlanmış.

JTwitter sayesinde, birkaç satır kod ile Java uygulamalarınız içerisinden Twitter hesabınıza ulaşabiliyor, “status” iletilerini alıp gönderebiliyor, arkadaş ağınızı yönetebiliyor, arkadaşlarınıza mesaj gönderebiliyorsunuz. Tabi sadece bu işlevleri gerçekleştirmek için tasarlanan bir kütüphane değil JTwitter. Twitter’ın sunduğu API ler aracılığı ile her türlü işlemi basitçe gerçekleştirmek mümkün. Bu da twitter.com üzerinde yapabildiğiniz hemen hemen herşeyi JTwitter ile de yapmak anlamına geliyor.

Aşağıdaki kod bloğu ile Twitter hesabına bağlanan, Twitter durumunuzu (status) güncelleyen ve “follower” listenizi çekip ekrana bastıran bir Java uygulaması geliştirebilirsiniz.

Devam »

Factory Design Pattern

Nesne yönelimli programlama dilleri ile geliştirilen uygulamaların tasarımı, uygulamanın bakım ve geliştirme süreçlerini etkileyen çok önemli bir aşamadır.

Geliştirilecek uygulamanın, daha sonra yazılımın diğer modüllerinden bağımsız olarak genişletilebilir, bakımının yapılabilir ve varolan kodların tekrar kullanılabilir olması yazılım mühendisliğinin ilgi alanlarından biridir.

Factory Design Pattern (Tasarım Şablonu) ile amaç, uygun nesneleri uygulamaya döndürmektir. Şablonun temel işlevi, adından da belli olduğu gibi sınıfların örneklerini üretmektir.

Bu tanımlamayı biraz daha açarsak, bir sınıfdan ya da interfaceden türetilen n tane alt sınıf varsa, bu altsınıfların herbiri birbirinden farklı birtakım özel işlemleri gerçekleştirmek için geliştirilmiştir. Fakat bu n tane altsınıfın herbiri, türetildiği üst sınıfın sağladığı methodları kalıtım ile devralır ya da interfacein sunduğu methodları uygulamak zorundadır.

Sonuçta bu altsınıflar, türetildiği üst sınıf ya da interfacein tasarlanış felsefesi ile alakalı işlemler gerçekleştirir. Factory tasarım şablonu ile amaçlanan, bu altsınıfları, sınıfların detayından bağımsız olarak uygulamaya döndürmektir.

Devam »

HttpServletRequest ve HttpServletResponse Sınıfları

Servletler, HTTP veya başka protokoller üzerinden gelen isteklere dinamik içerik üreten Java sınıflarıdır. Servlet teknolojisi sayesinde, HTTP protokolü kullanan web uygulamalarını Java ile oluşturmak mümkündür.

Bu yazıda, Servlet Containerlarının servlet nesneleri ile haberleşmesini sağlayan HttpServletRequest ve HttpServletResponse nesnelerinden ve bunların sağladığı methodlardan bahsedicem.Eğer bu nesneler veya servletler hakkında temel bilginiz yok ise, önce bu yazıyı okumanızı öneririm.

Öncelikle HttpServletRequest ve HttpServletResponse nesnelerine biraz daha yakından bakmak gerekiyor.

Devam »

Java Servlet – Üyelik Sistemi Uygulaması

Daha önce şurada temellerini açıklamaya çalıştığım Servletler, Java platformu üzerinde performanslı, dinamik web uygulamalar geliştirmek için tasarlanan java bileşenleridir.

Şimdi, Servlet kullanarak çok basit bir üyelik sistemi geliştirelim.

Yalnız örneğe geçmeden önce belirtmem gereken bir konu, burada geliştireceğimiz sistem tamamen Servletde işlerin nasıl döndüğünün daha iyi anlanabilmesi için tasarlanan çok basit bir üyelik sistemidir. Uygulama, aslında GET methodu kullanılarak istek yapan istemciye, Servlet içinde nasıl cevap verileceği ve URL ile aktarılan parametrelerin ne tür bir yaklaşımla işlenebileceğini göstermek amacı ile tasarlanmıştır.

Geliştireceğimiz üyelik sistemi, çok basit bir mantık çerçevesinde çalışmaktadır. login.html adında bir html dosyası ile kullanıcıdan, kullanıcı adını ve şifresini istiyoruz. Daha sonra, verilen parametreleri HTTP protokolünün GET methodu ile, LoginServlet adında geliştirdiğimiz servlete gönderiyoruz. Uygulama tamamen basit bir temelde hazırlandığından, herhangi bir dosya ya da veritabanı (database) üzerinden sorgulama yapmıyoruz. Eğer kullanıcı adı “javablog”, şifre de “servlet” ise, kullanıcıya bir hoşgeldin yazısı, eğer bunlardan biri yanlış ise bilgilerin doğru olmadığını belirten bir HTML çıktısı gösteriyoruz.

Şimdi uygulamamızı geliştirmeye başlayalım.

Devam »

Servlet Temelleri

Java Servlet teknolojisi, sunucu-istemci (server-side) tabanlı uygulamalar geliştirmek için tasarlanan, platform bağımsız Java bileşenleridir. Servlet sınıflarını kullanarak, dinamik içeriğe sahip, yüksek performanslı sunucu taraflı yazılımlar geliştirmek Java ile oldukça basitdir.

Servletler, herhangi bir protokole özel olarak tasarlanmış bileşenler değildir. Pekçok farklı protokol üzerinde çalışabilen sunucu-istemci uygulamalarını Java platformunda servlet teknolojisi ile geliştirebiliriz. Ancak, web uygulamaları ve dolayısı ile HTTP protokolü en popüler yapılar olduğu için, servletlerin daha çok bu protokol üzerinde çalışan versiyonları bu yazıda ele alınacaktır.

Servlet teknolojisini daha iyi anlamak için, öncelikle servletlerin neden ortaya çıktığından bahsetmek gerekir. Servletler, CGI teknolojisinde ortaya çıkan sorunları ortadan kaldırmak için Java platformuna kazandırılmıştır.

Devam »

Javada Stringler

String, bazı kitaplar “katar” olarak da Türkçe’ye çeviriyor, bir dizi karakterin birleşimidir.

Herhangi bir programlama dilinde stringler, kullanıcıdan veri almadan tutun yazılımın çıktı (output) olarak verdiği veriye kadar pekçok işlemde sıkça kullanılır. Bu yüzden stringler, yazılım geliştiricilerin iyi bilmesi ve dilin sağladığı özelliklerinin iyi kavranmış olması gerekir.

String kavramı programlamada oldukça önemli ve sık kullanılan bir yapı olduğu için Java, geliştiricilerin string ve bunlar üzerindeki işlemleri hızlı ve basit bir şekilde yapabilmesi için çok gelişmiş string kütüphaneleri sunar. C/C++ (özellikle C) gibi dillerde varolan string (C de string yapısı yoktur) yapılarından çok daha farklı ve gelişmiş bir string mekanizması sunan Java, stringleri birer nesne olarak ele alır. Bu sayede, nesne yönelimli programlamanın getirdiği pekçok nimeti, böylesi sık kullanılan bir yapıya kazandırmış olur.

Devam »

Singleton Design Pattern

Daha önce şurada derinlemesine açıklamaya çalıştığım design patterns (tasarım şablonları), nesne yönelimli yazılım geliştirme sürecinde ortaya çıkan pekçok farklı probleme akıllıca çözümler getirmek için geliştirilmiş yazılım mimarileridir.

Tamamen nesne yönelimli programlama yaklaşımını destekleyen Java ile de uygulama geliştirirken, pekçok tasarım şablonu kullanarak, ortaya çıkabilecek problemleri tasarım aşamasında minimuma indirebiliyoruz.

Java ile uygulama geliştirirken kullanılan en popüler tasarım şablonlarından biri de Singleton tasarım şablonudur. Singleton tasarım şablonunun getirdiği çözüm basitçe, şablon çerçevesinde tasarlanacak sınıfların sadece tek bir örneğinin (instance) oluşturulabilmesidir. Bu sayede nesnenin gereksiz birçok kopyasının oluşturulmasının önüne geçilir ve herhangi bir durumda nesneye ihtiyaç duyulduğunda o nesnenin daha önceden oluşturulan örneği kullanılır.

Devam »

Java Object Serialization

Java tamamen nesne yönelimli bir programlama dili olduğu için, Java üzerinde uygulama geliştirirken nesneleri sıkça kullanıyoruz. Java platformunda bilindiği gibi, int, double, byte gibi primitive tipler dışındaki herşey nesnedir.

Ancak Java’da kullanılan nesneler, Java platformunda (JVM) hayat bulurlar. Platform dışında nesnelerin, hiçbir anlamı yoktur. Nesne yönelimli programlama paradigmasını destekleyen Java’da, tasarlanan nesnelerin tekrar kullanılabilmesi (reuse) önemli bir konu olduğuna göre, bu nesneleri Java platformu dışında da hayata geçirmek gerçekten önemlidir. Bahsedilen bu problem, Java Serialization API sayesinde çok kolay bir şekilde aşılabiliyor.

Konuya bir de şu yönden bakarsak, herhangi bir nesne içerisindeki fieldları bir dosyaya yazdırdığımızda, bu verilerin sadece değerlerini (values) dosya içerisinde depolarız. Halbuki bu verilerin sınıf tanımlaması içerisindeki tipleri de en az değerleri kadar önemlidir. Herhangi bir nesnenin fieldındaki değer 3 ise, bu değerin string mi int mi olduğunun dosya üzerinde bir anlamı yoktur.

Java Serialization API sayesinde bir nesnenin birebir kopyasını, Java platformu dışında da depolayabiliriz. Bu mekanizma ile daha sonra,  nesneyi depolanan yerden çekip, aynı durum (state) ve özellikleri ile kullanmaya devam edebiliriz. Tüm bu sisteme, Object Serialization (Nesne Serileştirme) adı verilir.

Devam »

Java I/O File Sınıfı

Java, işletim sistemindeki dosya (file) ve klasörler (directories) hakkında her türlü bilgiyi alabileceğimiz çok kullanışlı bir sınıf tanımlar.

java.io paketi içerisinde bulunan File sınıfı sayesinde sistem üzerindeki dosya ve klasörler ile ilgili her türlü bilgiyi çekebiliyoruz. Ancak File sınıfı hakkında bilinmesi gereken en önemli nokta, File sınıfı herhangi bir dosyayı açmak ya da kapatmak gibi işlemler için tasarlanmamıştır. Dosya sistemi üzerinde bir dosya veya klasör ile ilişkilendirilerek, o nesne hakkında her türlü bilgiyi döndürür.

File sınıfı ile dosya ve klasörler için gereken işlemleri yapabilmemiz için, öncelikle Path (konum-yol) hakkında birkaç şey söylemek gerekiyor.

Devam »