zoukankan      html  css  js  c++  java
  • 反射

    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;
    }
  • 相关阅读:
    BCB 如何让Application收到SendMessage发送来的消息
    用BCB 画 Code128 B模式条码
    遍历SQL SERVER中所有存储过程和触发器
    EXCEL导入数据到SQL SERVER 2008
    TListView控件的ReadOnly属性的一个Bug
    Using Microsoft Visual C++ DLLs with C++Builder
    行列转换的例子
    WCF 使用Stream模式进行文件上传 --节选自Packt.Net.Framework.4.5.Expert.Programming.Cookbook
    WCF Endpoint分类
    SQL Error: 1064, SQLState: 42000
  • 原文地址:https://www.cnblogs.com/myname/p/5579520.html
Copyright © 2011-2022 走看看