java 注解和反射_Java注解和反射练习

直接上代码了!

package com.merryyou.annotation;

import java.lang.annotation.*;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface Key {

}

package com.merryyou.annotation;

import java.lang.annotation.*;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface notRecord {

}

package com.merryyou.annotation;

import java.lang.annotation.*;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface Table {

String name();

}

package com.merryyou.annotation;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

public class NumException extends Exception {

private String name;

public NumException(String message) {

this.name = message;

}

public NumException(Throwable cause, String name) {

super(name, cause);

this.name = name;

}

public String toString(){

return name;

}

}

package com.merryyou.annotation;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

@Table(name = "student")

public class Student {

@Key

private String id;

private String name;

@notRecord

private String sex;

private int age;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

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 int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

package com.merryyou.annotation;

import java.lang.reflect.Field;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

public class Processing {

public String save(Object cl) throws IllegalArgumentException , IllegalAccessException ,NumException{

String sql="insert into ";

if(cl!=null){

Field[] fiels=cl.getClass().getDeclaredFields();//获得反射对象集合 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

boolean t=cl.getClass().isAnnotationPresent(Table.class);//获得类是否有注解 如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。

if(t){

Table tab=cl.getClass().getAnnotation(Table.class);// 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。

sql+=tab.name();//获得表名

String name ="";//记录字段名

String value ="";//记录值名称

boolean bl=false;//记录主键是否为空

for(Field fl:fiels){//循环组装

fl.setAccessible(true);//开启支持私有变量的访问权限

Object tobj=fl.get(cl);//返回指定对象上此 Field 表示的字段的值。

if(tobj!=null){

if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键

bl=true;

}

if(!fl.isAnnotationPresent(notRecord.class)){

name+=fl.getName()+",";

value+="'"+tobj.toString()+"',";

}

}

}

if(bl){

if(name.length()>0)

name=name.substring(0,name.length()-1);

if(value.length()>0)

value=value.substring(0,value.length()-1);

sql+="("+name+") values("+value+")";

}else

throw new NumException("未找到类主键 主键不能为空");

}else

throw new NumException("传入对象不是实体类");

}else

throw new NumException("传入对象不能为空");//抛出异常

return sql;

}

}

package com.merryyou.annotation;

/**

* Created on 2016/10/31 0031.

*

* @author zlf

* @since 1.0

*/

public class ProcessingTest {

public static void main(String[] args) throws NumException, IllegalAccessException {

Student student = new Student();

student.setId("ccc");

student.setName("姓名");

student.setAge(18);

student.setSex("男");

System.out.println(new Processing().save(student));

}

}

输出结果:

insert into student(id,name,age) values('ccc','姓名','18')

你可能感兴趣的:(java,注解和反射)