dimanche 14 juin 2015

Java reflection - enum generate

I make program which can generate source code of class,enum and interfaces using reflection but I have problem with Enum generating.

My EumTest class

public enum EnumTest{
a,b;

private  String r;

private EnumTest(){

}

private void some(){

}

public int[] some2(int[] b){
    return b;
}
}

Method which generate enum file

private void generateEnum(Class<?> cls,PrintWriter writer) {
    this.writePackage(cls, writer);
    this.writeAnnotations(writer, cls.getDeclaredAnnotations());
    writer.write(Modifier.toString(cls.getModifiers())+ " enum " + cls.getSimpleName());
    this.writeImplementation(cls, writer);
    writer.write("{");
    this.writeNewLine(writer);
    Object[] cons = cls.getEnumConstants();
    for (int i = 0; i < cons.length; i++) {
        writer.write(cons[i].toString());
        if(i != cons.length - 1)
            writer.write(",");
    }
    writer.write(";");
    this.writeNewLine(writer);
    this.writeFields(cls, writer);
    this.writeConstructors(cls, writer);
    this.writeMethods(cls,writer);
    writer.write("}");
}

Result is this new Enum

package metaprogramovanie.test;
public final enum EnumTest{
a,b;
private java.lang.String r;
private static final metaprogramovanie.test.EnumTest[] $VALUES;

private EnumTest(java.lang.String arg0,int arg1){
}
public static metaprogramovanie.test.EnumTest[] values(){
return null;
}
public static metaprogramovanie.test.EnumTest valueOf(java.lang.String arg0){
return null;
}
private void some(){

}
public int daco(int arg0){
return 0;
}

}

As you can see there are som errors. For example Modifier generate FINAL and enum cant be final, next there are more methods and fields, constructor has paramaters ...

Constructor generate

private void writeConstructors(Class<?> cls, PrintWriter writer){
    Constructor[] cons = cls.getDeclaredConstructors();
    for (Constructor constructor : cons) {
        this.writeAnnotations(writer, constructor.getDeclaredAnnotations());
        writer.write(Modifier.toString(constructor.getModifiers()) + " " + cls.getSimpleName());
        this.writeParameters(writer,constructor.getParameters());
        writer.write("{");
        this.writeNewLine(writer);
        writer.write("}");
        this.writeNewLine(writer);
    }
}

Field generate

private void writeFields(Class<?> cls, PrintWriter writer){
    Field[] atr = cls.getDeclaredFields();
    for (Field field : atr) {
        if(field.isEnumConstant()){
            System.out.println("JE");
        }
        else{
            this.writeAnnotations(writer, field.getDeclaredAnnotations());
            writer.write(Modifier.toString(field.getModifiers())+" " + field.getType().getTypeName()+ " " + field.getName());
            if(Modifier.isStatic(field.getModifiers())){
                try{
                    Object value = field.get(null);
                    writer.write(" = " + this.getFieldValue(field));
                }catch(IllegalAccessException ex){

                }
            }
            writer.write(";");
            this.writeNewLine(writer);
        }
    }
    this.writeNewLine(writer);
}

Methods generate

 private void writeMethods(Class<?> cls, PrintWriter writer){
    Method[] methods = cls.getDeclaredMethods();
    for (Method met : methods) {
        this.writeAnnotations(writer, met.getDeclaredAnnotations());
        writer.write(Modifier.toString(met.getModifiers())+" "+met.getReturnType().getTypeName() +" "+ met.getName());
        this.writeParameters(writer, met.getParameters());
        writer.write("{");
        this.writeNewLine(writer);
        if(!met.getReturnType().equals(Void.TYPE)){
            this.writeMethodBody(writer,met);
        }
        this.writeNewLine(writer);       
        writer.write("}");
        this.writeNewLine(writer);
    }
    this.writeNewLine(writer);
}

If you have any ideas how to get enum which can be compiled.





Aucun commentaire:

Enregistrer un commentaire