Merhabalar,
Java'da Class bünyesinde bulunan yapılandırıcıları,alanları ve fonksiyonların kullanımı ile ilgili
daha önce yazdığım "Java Reflection Kullanımı" makalesi burada yer alıyor.
Bu konuya yönelik farklı sorular aldığım için "Java Reflection Kullanımı 2 " 'yi yazma gereği duydum.
Bu makalede geliştireceğimiz örnek uygulamada bir adet "Person.java" ve "Main.java" Classı bulunuyor.
Person class içeriğinde çeşitli set,get ve print fonksiyonları yer almaktadır.
Bu fonkisyonlar çeşitli veri türlerden parametrelere sahip. Bu fonksiyonlara Main.java tarafından parametre gönderilecektir. Ancak fonksiyonların aldığı parametre tür ve sayıları önemlidir.
Dolayısıyla kullanım aşamasında parametre türü ve parametre sayıları önem arz etmektedir.
Ayrıca parametre gönderilecek-işletilecek fonksiyonların isimleri bilinmelidir.
Tüm bu detaylara aşağıda yer verilmiştir.
Person.java Class içeriği:
public class Person {
private String name;
private String s_name;
private int age;
public Person(){
//Constructor
System.out.println("Constructor");
}
public void setName(String _n){
this.name = _n;
}
public void setSurname(String _sn){
this.s_name = _sn;
}
public void setAge(int _a){
this.age = _a;
}
public String getName(){
return this.name;
}
public void print(){
System.out.println("Name:" + name + "\nSurname:" + s_name + "\nAge:" + age);
}
public void setAandB(String _s,int _i){
//
System.out.println("" +_s +"," + _i);
}
}
Main.java Class içeriği:
public class Main {
public static void main(String[] args){
try{
//Class ismi:
/*
* farklı paket altında bulunan class'lar paket ismi ile belirtilmelidir.
* Örn 1: "java.util.Date"
* Örn 2: "java.io.InputStreamReader"
*/
String className = "Person";
//String olarak alınan Class ismi "Class"'a convert ediliyor:
Class<?> cClass = Class.forName(className);
///Class bünyesinde kullanılabilecek fonskiyonlar:
//Class'a ait yapılandırıcıları elde etmek için:
//public Constructor<?>[] getConstructors()
//Class'a ait paketi elde etmek için:
//public Package getPackage()
//Declare edilmiş Class'ları elde etmek için:
//public Class<?>[] getDeclaredClasses()
//Constructor çağrılıyor:
Object param = cClass.newInstance();
String methodName = "";
//setName isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
methodName = "setName";
//gönderilecek parametre türleri belirleniyor.
Method setNameMethod = param.getClass().getMethod(methodName, String.class);
//fonksiyona parametre gönderiliyor-işletiliyor:
setNameMethod.invoke(param, "Kerim");
//
//setSurname isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
methodName = "setSurname";
Method setSurNameMethod = param.getClass().getMethod(methodName, String.class);
setSurNameMethod.invoke(param, "FIRAT");
//
//setAge isminde tek int parametreye sahip fonksiyona parametre gönderiliyor:
methodName = "setAge";
Method setAgeNameMethod = param.getClass().getMethod(methodName, int.class);
setAgeNameMethod.invoke(param, 30);
//
//print isminde herhangi bir parametreye sahip olmayan fonksiyon çağrılıyor:
methodName = "print";
Method printMethod = param.getClass().getMethod(methodName);
printMethod.invoke(param);
//
//setAandB isminde iki ayrı türden parametreye sahip fonksiyona parametre gönderiliyor:
methodName = "setAandB";
/*
* gönderilecek parametre türleri belirleniyor.
* NOT: parametre türleri parametre sırasına göre belirlenmelidir.
*/
Class<?>[] paramTypes = {String.class, int.class};
//fonksiyon ismi ve parametre tür bilgisi tanımlanıyor:
Method setAandBMethod = param.getClass().getMethod(methodName, paramTypes);
//fonksiyona parametre gönderiliyor-işletiliyor:
setAandBMethod.invoke(param,"A",44);
//Class bünyesinde bulunan tüm fonksiyonları elde listelemek:
Method[] methods = Person.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
System.out.println("parametre sayısı = " +method.getParameterCount());
}
//Method class bünyesinde kullanılabilecek fonksiyonlar:
//fonksiyona ait parametreleri elde etmek için:
//public Parameter[] getParameters()
//fonksiyona ait Exception türünü elde etmek için:
//public Class<?>[] getExceptionTypes()
//fonksiyona ait parametre türlerini elde etmek için:
// public Class<?>[] getParameterTypes()
//fonksiyona ait dönüş türünü elde etmek için:
//public Class<?> getReturnType()
}catch(Exception e){
e.printStackTrace();
}
}
Çıktı:
Constructor
Name:Kerim
Surname:FIRAT
Age:30
A,44
İyi Çalışmalar.
Hiç yorum yok:
Yorum Gönder