反射

1.什么事反射?

就是通过class对象获得字段,方法等信息。


2.反射的常用方法?

反射常用于利用表达式直接生成SQL语句,以免在三成架构每一个设计的表应用的时候都要去写相应的SQL语句,利用反射生成SQL语句过后在与数据库转化要用到SQ2L语句是方便直接调用反射的方法就可以了

方法一:

Class classzz=Person.class;//Person是数据表的modle

方法二:

Person p=new Person();

Class classzz=p.getClass();

方法三:

Class classzz=class.forName("com.gxa.bj.test.Person");//这是Person所在的包


3.反射的应用场景?

//这是一个获得查询SQL语句的方法

public class BeanUtil {
   public static String getSelectSQL(Object obj)   throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{//这是后面直接生成的
              Class<? extends Object> classzz = obj.getClass();
              String tableName = classzz.getSimpleName();
              StringBuffer sbsql = new StringBuffer();
              sbsql.append("Select * From "+tableName+" ");
              sbsql.append(" Where 1=1 ");
              Field[] fields = classzz.getDeclaredFields();//获取所定义的字段
              for(Field f:fields){
                               String methodName ="get"+ f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);//通过反射获得方法值
                               Method m = classzz.getDeclaredMethod(methodName);//获取某个方法
                               Object o = m.invoke(obj);
                               if(o!=null){
                                    if(o instanceof String){//判断o是不是String类型
                                         sbsql.append(" And "+f.getName() +"='"+o+"' ");
                                     }else{
                                         sbsql.append(" And "+f.getName()+"="+o);
                                      }
                             }
             }
             return sbsql.toString();
   }


调用eg:

UserInfo u=new UserInfo();
userName="www";
userID=1111;
String UserInfoSQL= BeanUtil . getSelectSQL(u);


 

4.注解?怎么应用?

在反射的时候读取他的一些标记特性like:消费的时候拿的打折票,做标记,标记表中的主键

//对于字段的注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PrimaryKey {<span style="color:#ff0000;">//在modle中的字段主键上加上标记@PrimaryKey</span>
    
}

//对于类的注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NonField {


}


5.注解的实列?

//这是获得一个SQL修改语句的方法

 public static String getUpdate(Object obj) throws IllegalArgumentException, IllegalAccessException{
       Class<? extends Object> classzz = obj.getClass();
       String sql="Update "+ classzz.getSimpleName() + " Set ";
       String sql2=" ";
       String sql3=" Where ";
       Field[] fields = classzz.getDeclaredFields();
       for(Field f:fields){
               f.setAccessible(true);//可以访问private值
               Object value = f.get(obj);
               //如果该字段具备PrimaryKey的注解
               if(f.isAnnotationPresent(PrimaryKey.class)){
                    if(value instanceof String){
                         sql3 += f.getName() +"='"+value+"'";
                    }else{
                         sql3 += f.getName()+"="+value+"";
                    }
               }else if(!f.isAnnotationPresent(NonField.class)){
                    if(value instanceof String){
                         sql2 += f.getName() +"='"+value+"',";
                    }else{
                         sql2+=f.getName()+"="+value+", ";
                    }
              }
       }
       sql2 = sql2.substring(0,sql2.length()-1);
       sql = sql + sql2 +sql3;
       return sql;  
   }


//这是获得一个SQL插入语句的方法

 
public static String getInsert(Object obj) throws IllegalArgumentException, IllegalAccessException//插入
        {
         Class classzz = obj.getClass();
         String tableName=classzz.getSimpleName();
         Field[] fields= classzz.getDeclaredFields();
        // String sql = insert into xxx()values();
         String sql1="";
         String sql2="";
         for(Field f:fields){
                   f.setAccessible(true);
                   Object value = f.get(obj);
                   if(value!=null)  {
                        if(f.isAnnotationPresent(PrimaryKey.class))   {
                             sql1+=f.getName()+",";
         
                            sql2+="usernext.nextval,";
         
                       }   else if(!f.isAnnotationPresent(NonField.class))
                       {
                   sql1+=f.getName()+",";
                   if(value instanceof String)    {
                          sql2+="'"+value+"',";
                    }    else
                   {
                 sql2+=value+",";
         }
         }
         }
         
         }
         sql1=sql1.substring(0,sql1.length()-1);
         sql2=sql2.substring(0,sql2.length()-1);
         String sql = "insert into "+tableName+"("+sql1+")values("+sql2+")";
         return sql;
         
        }


//这是获得一个SQL删除语句的方法
 
 public static String getDelete(Object obj) throws IllegalArgumentException, IllegalAccessException//删除
        {
         Class classzz =obj.getClass();
         String tableName= classzz.getSimpleName();
         Field[] fields =classzz.getDeclaredFields();
         // delect from xx where userid =xx;
         StringBuffer sbsql =new StringBuffer("delete from "+tableName+" where ");
         for(Field f:fields)
         {
         f.setAccessible(true);
         Object value=f.get(obj);
         if(value!=null)
         {
         if(f.isAnnotationPresent(PrimaryKey.class))
         {
         if(value instanceof String)
         {
         sbsql.append(f.getName()+"= '"+value+"' ");
         }
         else
         {
         sbsql.append(f.getName()+"="+value+" ");
         }
         }
         }
         }
         return sbsql.toString();
         }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值