15 Temmuz 2018 Pazar

MethodHandles Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.lang.reflect.Method;
import java.lang.invoke.*;
arrayElementVarHandle metodu
öyle yaparız
VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class);
lookup metodu
Bir MethodHandles.Lookup nesnesi döndürür.
Örnek
Şöyle yaparız.
MethodHandles.Lookup lookup = MethodHandles.lookup();
in Kullanımı
Örnek - findVarHandle
Şöyle yaparız
VarHandle PUBLIC_TEST_VARIABLE = MethodHandles
  .lookup()
  .in(VariableHandlesUnitTest.class) // Class name
  .findVarHandle(VariableHandlesUnitTest.class, // Class name
                 "publicTestVariable", // Variable name
                  int.class // Variable type
  );
privateLookupIn
Örnek - findVarHandle
Şöyle yaparız
VarHandle PRIVATE_TEST_VARIABLE = MethodHandles
  .privateLookupIn(VariableHandlesUnitTest.class, MethodHandles.lookup())
  .findVarHandle(VariableHandlesUnitTest.class, "privateTestVariable", int.class);
unreflectSpecial Kullanımı
Ö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");
  }
}
Foo sınıfının doIt () metoduna erişmek için şöyle yaparız.
Bar b = new Bar();
Method m = Foo.class.getDeclaredMethod("doit", new Class[]{});
MethodHandle h = MethodHandles.lookup().unreflectSpecial(m, Bar.class);
h.invoke(b);


Hiç yorum yok:

Yorum Gönder