package aresoft.controller.test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Demo3 {
    @SuppressWarnings("unchecked")
    public static <T>  void test(){
        try {
            //1,加载类
            Class clazz=Class.forName("aresoft.controller.test.DemoBean");
            //2、根据构造器参数类型获取相应的构造器对象      
            Constructor csr = clazz.getConstructor(String[].class);  
            String str[]={"1","testname","man"};  
            //3、创建实体对象  
            T t1 = (T)csr.newInstance((Object)str);  
            
            List<Field> fieldList=getFields(clazz);
            int flag=0;
            Object obj=null;
            for(Field f:fieldList){
                if(isClassType(f)){   
                    flag=flag+1;
                    Method method=commonMethod(Meiju.GET.getName(),clazz,f);
//                    System.out.println(method.getReturnType());
                    if(!method.getReturnType().toString().equals("void")){
                        obj=method.invoke(t1,new Object[]{});
                    }
                    System.out.println(obj.toString());
                    
                    if(flag>2){
                        break;
                    }
                    Annotation[] as=f.getAnnotations();   //每个Field 的注释
                    if(as.length >=0){
                        for(Annotation a:as){
                        //    System.out.println("annotation:"+a.toString());
                        }
                    }
                }
            }
            
            
            //方法注解
            Zhujie zjmethod=clazz.getMethod(commonMethod(Meiju.GET.getName(),clazz,fieldList.get(1)).getName(),new Class[]{}).getAnnotation(Zhujie.class);
            System.out.println("getName()方法的注解:"+zjmethod.name());
            //字段注解
            Zhujie zjfield=clazz.getDeclaredField((fieldList.get(1)).getName()).getAnnotation(Zhujie.class);
            System.out.println("name字段的注解:"+zjfield.name());
            
            
                                         //利用枚举获得方法的前面是get还是set
            Method setmethod=commonMethod(Meiju.SET.getName(),clazz,fieldList.get(3));
            if(setmethod.getReturnType().toString().equals("void")){ //如果返回类型 void
                System.out.println("无返回类型");
            }
            Integer i=new Integer(1);
            setmethod.invoke(t1,i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //得到所有的Field包括父类的
    public static List<Field> getFields(Class<?> clazz){
        List<Field> fieldList=new ArrayList<Field>();
        do{
            Field[] fields=clazz.getDeclaredFields();
            for(Field f:fields){
                fieldList.add(f);
            }
            clazz=clazz.getSuperclass();
        }while(clazz != Object.class && clazz!=null);
        return fieldList;
    }
    //判断Field是否是基本类型
    public static Boolean isClassType(Field field){
        Class<?> type=field.getType();
        Boolean isBaseClass=false;
        if(type.isPrimitive() || type.getPackage() !=null
                || type.getPackage().getName().equals("java.lang")
                || type.getPackage().getName().equals("java.math")
                || type.getPackage().getName().equals("java.math")){
            isBaseClass=true;
        }else if(type.isArray()){
            isBaseClass=false;
        }
        return isBaseClass;
    }
    //Method  get
    public static Method getMethod(Class<?> clazz,Field field){
        StringBuffer sb =new StringBuffer();
        sb.append(Meiju.GET.getName());
        Method method=null;
        try {
            String firstChar=field.getName().substring(0, 1).toUpperCase();
            sb.append(firstChar);
            sb.append(field.getName().substring(1, field.getName().length()));
            method=clazz.getDeclaredMethod(sb.toString(),new Class[]{});
        } catch (Exception e) {
            e.printStackTrace();
        }
        return method;
    }
    //Method  set
    public static Method setMethod(Class<?> clazz,Field field){
        StringBuffer sb =new StringBuffer();
        sb.append(Meiju.SET.getName());
        Method method=null;
        try {
            String firstChar=field.getName().substring(0, 1).toUpperCase();
            sb.append(firstChar);
            sb.append(field.getName().substring(1, field.getName().length()));
            method=clazz.getDeclaredMethod(sb.toString(),field.getType());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return method;
    }
    
    //Method common
    public static Method commonMethod(String gsmethod,Class<?> clazz,Field field){
        StringBuffer sb =new StringBuffer();
        sb.append(gsmethod);//get or set
        Method method=null;
        try {
            String firstChar=field.getName().substring(0, 1).toUpperCase();
            sb.append(firstChar);
            sb.append(field.getName().substring(1, field.getName().length()));
            if(gsmethod.equals(Meiju.GET.getName())){
                method=clazz.getDeclaredMethod(sb.toString(),new Class[]{});
            }else if(gsmethod.equals(Meiju.SET.getName())){
                method=clazz.getDeclaredMethod(sb.toString(),field.getType());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return method;
    }
    public static void main(String[] args) {
        test();
    }
}

//实体类

package aresoft.controller.test;

import javax.persistence.Column;
@Zhujie(name="jeecg_demo")
public class DemoBean {
    /**id*/
    @Zhujie(name="id")
    private String id;
    /**姓名*/
    @Zhujie(name="name")
    private String name;
    /**性别*/
    private String sex;
    /**年龄*/
    private Integer age;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Zhujie(name="jeecg_demo_method")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public DemoBean(String[] string) {
        super();
        this.id = string[0];
        this.name = string[1];
        this.sex = string[2];
    
    }
    public DemoBean() {
        super();
        // TODO Auto-generated constructor stub
    }
    
}
 

//注解

package aresoft.controller.test;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Zhujie {
     String name() default "test";
    
}

//枚举

package aresoft.controller.test;

public enum Meiju {
    GET("get"),SET("set");
    private String name;
    
    
    private Meiju(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}