反射

1.什么事反射?

   1>class对象:就是在jvm(java虚拟机)提供给每个类的标记对象。

   2>反射:通过class对象去获取每个类的相关信息。

2.(获取)反射的常用方法?

   方法一:

    Class classzz = Person.class;

   方法二:

    Person p = new Person();

    Class classzz = p.getClass();

   方法三:

    Class classzz = Class.forName("com.gxa.bj.text.person");  //通过地址获取。person是建的一个类,里面有name和age.

    


3.反射的应用场景。
//使用反射生成查询语句
public static String getSelectSQL(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
//select * from userInfo
Class<? extends Object>classzz=obj.getClass();
String className=classzz.getSimpleName();//获取表名
 
String sql="select * from "+className+" where 1=1 ";
Field[] fields=classzz.getDeclaredFields();//获取字段
for(Field f:fields){
String methodName ="get"+ f.getName().substring(0,1).toUpperCase()+f.getName().substring(1);
System.out.println(methodName);
Method m= classzz.getDeclaredMethod(methodName);//获取某个方法
  Object o = m.invoke(obj);
   if(o!=null){
   if(o instanceof String){
      sql+=" And "+f.getName() +"='"+o+"' ";
   }else{
  sql+=" And "+f.getName()+"="+o;
   }
   }
}
 
return sql;
}

//更新语句
public static String getUpdateSQL(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<? extends Object>classzz=obj.getClass();
String className=classzz.getSimpleName();//获取表名
//sbsql.append("update userInfo set uname='123',upassWord='123' where userid='1001'");
 
String sql="update "+className+" set ";
String sql1="";
String sql2=" where ";
Field[] fields=classzz.getDeclaredFields();//获取字段
for(Field f:fields){
    f.setAccessible(true);//可以访问私有的字段
    Object value=f.get(obj);
    if(f.isAnnotationPresent(PrimaryKey.class)){
     if(value instanceof String){
     sql2+=f.getName()+" = '"+value+"'";
     }else{
     sql2+=f.getName()+" = "+value+"";
     }
    }else{
     if(value instanceof String){
     sql1+=f.getName()+" = '"+value+"',";
     }else{
     sql1+=f.getName()+" = "+value+",";
     }
    }
}
sql1=sql1.substring(0,sql1.length()-1);
return sql+sql1+sql2;
}
//添加
public static String getInsertSQL(Object obj) throws IllegalArgumentException, IllegalAccessException{
//insert into USERINFO(userid,uName,uPassword,utelephone,uEmail,uAddress,uRegDate,utypeid) 
//values('123','123','123','123','123@123.com','四川成都','2016年12月12日测试日期','2');
Class<? extends Object>classzz=obj.getClass();
String className=classzz.getSimpleName();//获取表名
 
String sql1="insert into "+className+"(";
String sql2="";
String sql3=")values(";
String sql4=")";
Field[] fields=classzz.getDeclaredFields();//获取字段
for(Field f:fields){
f.setAccessible(true);//可以访问私有的字段
    Object value=f.get(obj);
     sql2+=f.getName()+",";
     if(value instanceof String){
     sql3+=" '"+value+"',";
     }else{
     sql3+=" "+value+",";
     }
 
}
sql2=sql2.substring(0,sql2.length()-1);
sql3=sql3.substring(0,sql3.length()-1);
String sql=sql1+sql2+sql3+sql4;
return sql;
}
删除
public static String getDelById(Object obj) throws IllegalArgumentException, IllegalAccessException{
//delete from userInfo where userid='123';
Class<? extends Object>classzz=obj.getClass();
String className=classzz.getSimpleName();//获取表名
String sql="delete from "+className+" where ";
Field[] fields=classzz.getDeclaredFields();//获取字段
for(Field f:fields){
    f.setAccessible(true);//可以访问私有的字段
    Object value=f.get(obj);
    if(f.isAnnotationPresent(PrimaryKey.class)){
     if(value instanceof String){
     sql+=f.getName()+" = '"+value+"'";
     }else{
     sql+=f.getName()+" = "+value+"";
     }
    }
}
return sql;
}
 
}
 
4.什么是注解,注解的常用规范。
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
5.注解的实例。
package com.gxa.bj.model;
 
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 {//这是一个标示主键的注解
 
}
public class UserInfo { 
 
private String uName;
private String uPassWord;
//在model层标示主键
@PrimaryKey
private String userId;
 
 
public String getUName() {
return uName;
}
public void setUserName(String uName) {
this.uName = uName;
}
public String getUPassWord() {
return uPassWord;
}
public void setUPassWord(String uPassWord) {
this.uPassWord = uPassWord;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}


6.反射加注解实现SQL的语句的生成。 
 
//更新语句
public static String getUpdateSQL(Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class<? extends Object>classzz=obj.getClass();
String className=classzz.getSimpleName();//获取表名
//sbsql.append("update userInfo set uname='123',upassWord='123' where userid='1001'");
 
String sql="update "+className+" set ";
String sql1="";
String sql2=" where ";
Field[] fields=classzz.getDeclaredFields();//获取字段
for(Field f:fields){
    f.setAccessible(true);//可以访问私有的字段
    Object value=f.get(obj);
    if(f.isAnnotationPresent(PrimaryKey.class)){//判断是否被注解为主键
     if(value instanceof String){
     sql2+=f.getName()+" = '"+value+"'";
     }else{
     sql2+=f.getName()+" = "+value+"";
     }
    }else{
     if(value instanceof String){
     sql1+=f.getName()+" = '"+value+"',";
     }else{
     sql1+=f.getName()+" = "+value+",";
     }
    }
}
sql1=sql1.substring(0,sql1.length()-1);
return sql+sql1+sql2;
}
原文地址:https://www.cnblogs.com/myname/p/5579520.html