30 Ocak 2023 Pazartesi

Class.getDeclaredMethod metodu

Giriş
- Access modifier tipine bakmaksızın nesnenin tanımladığı - kalıtımla gelen hariç - ismi belirtilen metodu döner. 
- Class.getDeclaredMethod bir metodunun istenilen şeyi bulabilmesi için metoda geçilen parametrelerin de yani doğru verilmesi gerekir.

Örnek - public method
Elimizde şöyle bir sınıf olsun. Erişmek istediğiniz metod public.
public class Foo {
  public void isFoo(Object obj) {
    ...
  }
}
Metodu bulmak için şöyle yaparız.
Class c = Foo.class;
Method m = c.getDeclaredMethod("isFoo", Object.class);
Metodumuz birden çok parametre alsaydı ikinci parametreyi bir dizi olarak geçebilirdik.
String methodName = ...;
Class[] types = ...;
Method method = c.getDeclaredMethod(methodName, types);
Örnek - protected method
Elimizde şöyle bir sınıf olsun. Bu sefer erişmek istediğimiz metod protected.
public class PrivateCar {

  private String color;

  protected void drive() {
    System.out.println("this is private car! the color is:" + color);
  }
}
Şöyle yaparız.
Class clazz = loader.loadClass("javaReflect.test.PrivateCar");
Method method = clazz.getDeclaredMethod("drive");
Örnek - Method İmzası
MyClass sınıfı içinde bir main metodu olsun. 
public static void main(String[] args) {...}
Onu bulmak için şöyle yaparız. Burada metod imzasında parametrenin String[] olduğunu belirmek gerekiyor.
Method mainMethod = MyClass.classgetDeclaredMethod("main", String[].class);
Diğer
Örnek

Elimizde Foo ata sınıfı olsun.
public class Foo {
  public void doit() {
    System.out.println("good");
  }
}
Bu sınıftan kalıtan Bar sınıfı olsun
public class Bar extends Foo {
  public void doit() {
    System.out.println("bad");
  }
}
Method nesnesine Foo.class olarak erişsek bile ve hatta çağırırken yine Foo sınıfına cast etsek bile Bar sınıfının doIt() metodu çağrılır. Çıktı olarak bad alırız.
Bar b = new Bar();
/* Using Foo.class */
Method m = Foo.class.getDeclaredMethod("doit", new Class[]{});

m.invoke((Foo)b, new Object[]{});


Hiç yorum yok:

Yorum Gönder