21 Aralık 2017 Perşembe

JCodeModel

Giriş
JCodeModel kullanması zor bir kütüphane. Kod üretmek için işe yarıyor. Bazı notlarım şöyle. pom'da şöyle yaparız.
<dependency>
  <groupId>com.sun.codemodel</groupId>
  <artifactId>codemodel</artifactId>
  <version>2.6</version>
</dependency>
JBlock Sınıfı
assign metodu
Şöyle yaparız.
JFieldVar a = ...;

block.assign(a, JExpr.lit(5));
_return metodu
JReturn döner.
Örnek
null dönen bir metod için şöyle yaparız.
method.body()._return(JExpr._null());
Örnek
Şöyle yaparız.
JDefinedClass aClass = codeModel._class(JMod.PUBLIC, "A", ClassType.CLASS);
JMethod method= aClass.method(JMod.PUBLIC, aClass, "method1");
method.body()._return(JExpr._new(aClass));
Çıktı olarak şunu alırız.
public class A {
  public A method1() {
    return new A();
  }
}
JClass Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JClass;
method metodu
Şöyle yaparız.
JType genericType = ...;
 JMethod jmethod = clazz.method(JMod.PUBLIC | JMod.STATIC, genericType, "get");
narrow metodu
Şöyle yaparız.T <? extends A> gibi bir JClass döner.
JClass clazz = codeModel.ref(Class.class).narrow(
  codeModel.ref(Serializable.class).wildcard());
clazz nesnesi şöyledir.
private Class<? extends Serializable> dataType;
JClassContainer Sınıfı
Bir java dosyasında birden fazla class üretmek için kullanılır.
_class metodu
CodeMode._class ile aynıdır.
isClass metodu
Örnek ver

JCodeModel Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JCodeModel;
constructor
Şöyle yaparız.
JCodeModel codeModel = new JCodeModel()
build metodu
Örnek
Şöyle yaparız.
codeModel.build(new File("src/main/java/generated/"))
Örnek
Şu satırı dahil ederiz.
import com.sun.codemodel.CodeWriter;
import com.sun.codemodel.writer.SingleStreamCodeWriter;
Şöyle yaparız.
CodeWriter codeWriter = new SingleStreamCodeWriter(System.out);
codeModel.build(codeWriter);
_class metodu - string
Parametre olarak fully qualified name alır. Yeni sınıf üretir. Sınıfın tüm ismi verilir. Şöyle yaparız.
JDefinedClass clazz = codeModel._class( "com.example.ExampleClass" );
_class metodu - string + ClassType
Parametre olarak fully qualified name alır. ClassType CLASS,INTERFACE,ANNOTATION_TYPE_DECL,ENUM olabilir.

directClass metodu
Şöyle yaparız.
JType genericType = codeModel.directClass("T");
_package metodu
Şöyle yaparız. Sınıfın tüm ismini vermek yerine önce paket tanımlarız.
JPackage jp = codeModel._package("com.example")
ref metodu
JClass döner. Şöyle yaparız.
codeModel.ref("android.support.v7.widget.RecyclerView.ViewHolder")
JDefinedClass Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JDefinedClass;
constructor metodu
Sınıfa constructor ekler. Şöyle yaparız.
JMethod constructor = clazz.constructor(JMod.PUBLIC);
field metodu
Sınıfa alan ekler.
Örnek
Şöyle yaparız.
JFieldVar a = clazz.field(JMod.PUBLIC, Integer.TYPE, "a");
method metodu
Object dönen getter için şöyle yaparız. Birince parametre metodun public/protected vs ne olacağını belirtir. İkinci parametre dönüş tipini belirtir. Üçüncü parametre metod ismini belirtir.
JMethod method = clazz.method( JMod.PUBLIC, Object.class, "getValue" );
JExpr Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JExpr;
ref metodu
null dönen bir metod için şöyle yaparız.
method.body()._return(JExpr.ref("null"));
JMethod Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JMethod;
body metodu
JBlock döner. null dönen bir metod için şöyle yaparız.
method.body()._return(JExpr.ref("null"));
generify metodu
Şöyle yaparız.
method.generify("T", Number.class);
Üretilen metod generic'tir ve şöyledir
public static<T extends Number >T get(...) {
  return ...;
}
param metodu
Metodun girdi parametresini vermek için şöyle yaparız. Eğer parametrenin aynı zamanda import edilmesi de gerekiyorsa codeModel.directClass() çağrısı ile parametre tipini elde etmek işe yaramıyor.
JClass parameterType = ...;
method.param(parameterType, "type");
JPackage Sınıfı
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JPackage;
_class metodu
Şöyle yaparız.
JPackage jp = codeModel._package("com.example")
JDefinedClass clazz = jp._class("ExampleClass")

Hiç yorum yok:

Yorum Gönder