1 Mart 2019 Cuma

JCodeModel

Giriş
JCodeModel kullanması zor bir kütüphane. Kod üretmek için işe yarıyor. Bazı notlarım şöyle. Açıklaması şöyle.
And if you want to live on the edge, you can always use a library like ASM or BCEL to generate classes or CodeModel to generate Java source files, thus making sure the syntax is correct, and the generated classes can be easily modified (adding annotations, for example) in a way that will not break compilation.
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ı - Soyut Sınıf
Giriş
Şu satırı dahil ederiz.
import com.sun.codemodel.JClass;
Interface, enum, class gibi şeylerin atasıdır.

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")
JCondition Sınıfı - If Koşulu Üretir
constructor
Şöyle yaparız
JConditional condition = body._if(input.lt(JExpr.lit(42)));
condition._then().add(
 codeModel.ref(System.class).staticRef("out").invoke("println").arg(JExpr.lit("hello"))); 
condition._else().add(
 codeModel.ref(System.class).staticRef("out").invoke("println").arg(JExpr.lit("world")));
Çıktı olarak şunu alırız.
f (input< 42) {
    System.out.println("hello");
} else {
    System.out.println("world");
}
JDefinedClass Sınıfı - Sınıf Üretir
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"));
JForLoop Sınıfı - For Döngüsü Üretir
constructor
Şöyle yaparız
JForLoop forLoop = body._for();
JVar ivar = forLoop.init(codeModel.INT, "i", JExpr.lit(0));
forLoop.test(ivar.lt(JExpr.lit(42)));
forLoop.update(ivar.assignPlus(JExpr.lit(1)));

forLoop.body().add(
    codeModel.ref(System.class).staticRef("out").invoke("println").arg(ivar));
Çıktı olarak şunu alırız
for (int i = 0; (i< 42); i += 1) {
    System.out.println(i);
}
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