8 Temmuz 2020 Çarşamba

Class Sınıfı

constructor
Şöyle yaparız.
Class<?> c = Class.forName("...");
Şöyle yaparız.
Class<Foo> c = Foo.class;
asSubclass metodu
İmzası şöyle.
public <U> Class<? extends U> asSubclass(Class<U> clazz)
Verilen impl nesnesinden ata sınıftan kalıttığını belirten Class nesnesini döndürür.
Normalde sınıfın Class tipi şöyledir.
AbstractList<String> ls = new ArrayList<>();
Class<? extends AbstractList> clazz = ls.getClass();
Eğer ben bunu
Class<? extends Foo> clazz = ...
haline getirmek istersem asSubClass() metodunu kullanırım.

Örnek
Elimizde şöyle bir hiyeraşi olsun
Foo <- Bar
Şöyle yaparız.
Class<? extends Foo> clazz = bar.asSubclass(Foo.class);
Örnek
Şöyle yaparız.
final Class<? extends Xyz> clazz = resultClass.asSubclass(Xyz.class);
cast metodu
Generic kodlarda kullanılır. Verilen nesneyi downcast yani kalıtan sınıfa çevirir.
Örnek
Şöyle yaparız.
<T> T doSomething(Class<T> cls) {
    Object o;
    // snip
    return cls.cast(o);
}
Örnek
Elimizde şöyle bir kod olsun.
Collection<?> filerCollection = ...;
Class<T> classType = ...;
Şöyle yaparız.
return filter.stream()
             .filter(classType::isInstance) // only keep elements of type T
             .map(classType::cast)          // safely cast from Object to T
             .collect(Collectors.toList()); // collect into a List<T>
forName metodu
Paket + Sınıf İsmi verilir. Şöyle yaparız.
Class<?> c = Class.forName("...");
getComponentType metodu
Eğer String[] varsa Class<String> döner.
Örnek
Şöyle yaparız.
Integer[] ar = new Integer[1];
Class<?> componentType = ar.getClass().getComponentType();
getConstructor metodu
Açıklaması şöyle.
Returns a Constructor object that reflects the specified public constructor of the class represented by this Class object. The parameterTypes parameter is an array of Class objects that identify the constructor's formal parameter types, in declared order. If this Class object represents an inner class declared in a non-static context, the formal parameter types include the explicit enclosing instance as the first parameter.
Şöyle yaparız.
Class<MyClass> c;
// ... 
Constructor<MyClass> constructor = c.getConstructor(String.class);
MyClass instance = constructor.newInstance("...");
getDeclaredClasses metodu
Inner sınıfları verir.
Örnek
Şöyle yaparız.
Class<MyClass> c;
Class[] innerClass = c.getDeclaredClasses();
Örnek
Elimizde şöyle bir kod olsun.
public class A {

   private class B
   {
   }

   private final B b = new B();

   public static void main(String[] args) {
       Class<?> bClass = A.class.getDeclaredClasses()[0];
       Constructor<?>[] declaredConstructors = bClass.getDeclaredConstructors();
       System.out.println(declaredConstructors.length);  //result = 2
   }
}
Şöyle yaparız.
public static void main(String[] args) {
  Class<?> bClass = A.class.getDeclaredClasses()[0];
  Constructor<?>[] declaredConstructors = bClass.getDeclaredConstructors();
  System.out.println(declaredConstructors.length);
}
getDeclaredConstructor metodu
Parametre almayan constructor için şöyle yaparız.
Class<MyClass> c;
Constructor constructor = c.getDeclaredConstructor();
Tek parametre alan constructor için şöyle yaparız.
Constructor constructor = c.getDeclaredConstructor(String.class);
Çok parametreli constructor için şöyle yaparız.
Class[] cArg = new Class[3]; //Our constructor has 3 arguments
cArg[0] = Long.class; //First argument is of *object* type Long
cArg[1] = String.class; //Second argument is of *object* type String
cArg[2] = int.class; //Third argument is of *primitive* type int


Constructor constructor = c.getDeclaredConstructor(cArg);
getDeclaredConstructors metodu
Tüm constructor'ları verir. Şöyle yaparız.
Class<MyClass> c;
Constructor constructor = c.getDeclaredConstructors()[0];
getDeclaredFields metodu - Kalıtımla Gelmeyen Tüm Alanlar
Açıklaması şöyle. Sınıf tarafından tanımlanmış, kalıtımla gelmeyen tüm alanları (public+ protected + private dahil) verir.
Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object. This includes public, protected, default (package) access, and private fields, but excludes inherited fields. The elements in the array returned are not sorted and are not in any particular order. This method returns an array of length 0 if the class or interface declares no fields, or if this Class object represents a primitive type, an array class, or void.
Şöyle yaparız.
// Get all the field of the class
Field[] fields = Foo.class.getDeclaredFields();
getDeclaredMethods metodu
Method Sınıfı yazısına taşıdım.

getDeclaredMethod metodu
Method Sınıfı yazısına taşıdım.

getEnclosingClass metodu
Bir sınıfın sarmaladığı sınıfı döner.
Örnek
Elimizde Array tabanlı bir liste olsun.
List<String> list = Arrays.asList(array);
Şöyle yaparız.
static <T> boolean wasListProducedAsAResultOfCallingTheFunctionArrays_asList(List<T> l) {
  return Arrays.class.equals(l.getClass().getEnclosingClass());
}
getFields metodu - Tanımlanan ve Kalıtımla Gelen Public Alanlar
Şöyle yaparız
// returns inherited members but not private members.
Field[] fields = ClassName.class.getFields();

// returns all members including private members but not inherited members.
Field[] fields = ClassName.class.getDeclaredFields();

getMethod metodu
Açıklaması şöyle.
To find a matching method in a class C: If C declares exactly one public method with the specified name and exactly the same formal parameter types, that is the method reflected. If more than one such method is found in C, and one of these methods has a return type that is more specific than any of the others, that method is reflected; otherwise one of the methods is chosen arbitrarily.
getModifiers metodu
Açıklaması şöyle.
int java.lang.Class.getModifiers()
Returns the Java language modifiers for this class or interface, encoded in an integer. The modifiers consist of the Java Virtual Machine's constants for public, protected, private, final, static, abstract and interface; they should be decoded using the methods of class Modifier.
If the underlying class is an array class, then its public, private and protected modifiers are the same as those of its component type. If this Class represents a primitive type or void, its public modifier is always true, and its protected and private modifiers are always false. If this object represents an array class, a primitive type or void, then its final modifier is always true and its interface modifier is always falseThe values of its other modifiers are not determined by this specification.
The modifier encodings are defined in The Java Virtual Machine Specification, table 4.1.
Şöyle yaparız.
System.out.println(Modifier.isAbstract(byte[].class.getModifiers())); 
getName metodu
Sınıfın paket ismi dahil tüm ismini döner. Elimizde şu kod olsun
class A {
  private int a = 1;

  public int getA() {
    if (getClass().equals(A.class) || 
      getClass().getSuperclass().getName()
        .equals(A.class.getName())) {
          return a;
    } else {
      throw new IllegalStateException("hahaha");
    }
  }        
}

class B extends A {}

class C extends B {}
getA() metodu sadece A ve B için çalışır. C için exception fırlatır. Şöyle yaparız.
A a = new A();
B b = new B();
C c = new C();
System.out.println(a.getA());
System.out.println(b.getA());
System.out.println(c.getA());
Çıktı olarak şunu alırız.
1
1
Exception in thread "main" java.lang.IllegalStateException: hahaha
getProtectionDomain metodu
ProtectionDomain nesnesi döner.

getResource metodu
Class İle Resource Yüklemek yazısına taşıdım.

getResourceAsStream metodu
Class İle Resource Yüklemek yazısına taşıdım.

getSimpleName metodu

Sadece sınıfın ismini verir.
Örnek
Şöyle yaparız. Çıktı olarak örneğin "Foo" alırız.
c.getSimpleName()
getSuperClass metodu
Sınıfın atasını döner.
Class c =...;
c = c.getSuperclass();
isAnnotationPresent metodu
Class İle Anotasyonlara Erişmek yazısına taşıdım.

isAnonymous metodu
Sınıfın anonim olup olmadığını döner.
Class c = ...;
if c.isAnonymousClass()) {...}
isArray metodu
Şöyle yaparız.
boolean isArrayOrCollection = Collection.class.isAssignableFrom(fooClass) ||
                              fooClass.isArray();
isAssignableFrom metodu
İlk nesnenin parametre olarak verilen nesnenin atası olup olmadığını döner.
Örnek
Şöyle yaparız.
Class<?> fooClass = foo.getClass();
boolean isArrayOrCollection = Collection.class.isAssignableFrom(fooClass) ||
                              Object[].class.isAssignableFrom(fooClass);
Örnek
Örneğin Comparable arayüzü String sınıfının atasıdır.
Comparable.class.isAssignableFrom (String.class)
isEnum metodu
Sınıfın enum olup olmadığını döner.
Class c = ...;
if c.isEnum() {...}
isInstance metodu
isInstance metodu yazısına taşıdım.

newInstance metodu - Parameterless
Sınıfın default constructor metodunun olması gerekir yoksa
java.lang.InstantiationException: 
alırız. Açıklaması şöyle.
InstantiationException - if this Class represents an abstract class, an interface, an array class, a primitive type, or void; or if the class has no nullary constructor; or if the instantiation fails for some other reason.
Not 1
- JDK Serialization default constructor'ı çağırmaz. XStream Enhanced Mode'da çalışıyorsa da çağırmaz.

Örnek
Şöyle yaparız
Class c = Class.forName("com.foo.Bar");

Bar bar = (Bar)c.newInstance();
Örnek
Şöyle yaparız.
MyClass foo = (MyClass)c.newInstance();
newInstance metodu - Parametreyle
Default Constructor yoksa doğru contructor metodunu bulup, doğru parametrelerle çağırmak gerekir.
Doğru constructor metodunu bulmak için şu yöntemlerden birisi seçileblir.

Çözüm 1
getConstructor(..) çağrısı ile bir constructor metodu bulunur sınıf yaratılabilir.

Çözüm 2
- Ya da getDeclaredConsructor() çağrısı ile şöyle yaparız.
clazz.getDeclaredConstructor (String.class).newInstance("...");
Çözüm 3
Apache Commons projesindeki ConstructorUtils.getMatchingAccessibleConstructor() metodu kullanılır


Hiç yorum yok:

Yorum Gönder