Giriş
JCodeModel kullanması zor bir kütüphane. Kod üretmek için işe yarıyor. Bazı notlarım şöyle. Açıklaması şöyle.
JClass Sınıfı - Soyut Sınıf
Giriş
Şu satırı dahil ederiz.
method metodu
Şöyle yaparız.
Bir java dosyasında birden fazla class üretmek için kullanılır.
JCodeModel Sınıfı
Giriş
Şu satırı dahil ederiz.
Örnek
Şöyle yaparız.
Şu satırı dahil ederiz.
Parametre olarak fully qualified name alır. Yeni sınıf üretir. Sınıfın tüm ismi verilir. Şöyle yaparız.
Parametre olarak fully qualified name alır. ClassType CLASS,INTERFACE,ANNOTATION_TYPE_DECL,ENUM olabilir.
directClass metodu
Şöyle yaparız.
Şöyle yaparız. Sınıfın tüm ismini vermek yerine önce paket tanımlarız.
constructor
Giriş
Şu satırı dahil ederiz.
Sınıfa alan ekler.
Örnek
Şöyle yaparız.
Giriş
Şu satırı dahil ederiz.
JForLoop Sınıfı - For Döngüsü Üretir
constructor
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ı
JReturn döner.
Örnek
Ö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();
}
}
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 - stringParametre 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 + ClassTypeParametre 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 Üretirconstructor
Şö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 ÜretirGiriş
Ş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 metoduSı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;
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);
}
JBlock döner. null dönen bir metod için şöyle yaparız.
Şöyle yaparız.
method.body()._return(JExpr.ref("null"));
generify metoduŞöyle yaparız.
method.generify("T", Number.class);
Üretilen metod generic'tir ve şöyledirpublic 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.
Giriş
Şu satırı dahil ederiz.
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