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;
}
4.什么是注解,注解的常用规范。
//更新语句
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;
}
}
定义:注解(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;
}
|