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;
}
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();
}