问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

Java的反射机制是什么,如何实现

提问网友 发布时间:2022-04-23 04:07
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
2个回答
懂视网 回答时间:2022-05-02 05:07

  技术分享

 

2.BasicDao.java

  static{
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public Connection getConnection() throws SQLException{
    String url = "jdbc:mysql://127.0.0.1:3306/dbparam?autoReconnect=true&useUnicode=true&characterEncoding=UTF8";
    String user = "root";
    String password = "123456";
    return DriverManager.getConnection(url, user, password);
  }

  public void close(ResultSet rs, Statement st, Connection conn){
    if(rs!=null){
      try {rs.close();} catch (SQLException e) {e.printStackTrace();}
    }
    if(st!=null){
      try {st.close();} catch (SQLException e) {e.printStackTrace();}
    }
    if(conn!=null){
      try {conn.close();} catch (SQLException e) {e.printStackTrace();}
    }
  }

  public String getMethodName(String fieldName){
    byte[] buffer = fieldName.getBytes();
    buffer[0] = (byte)(buffer[0]-32);
    String name = new String(buffer);
    return "get"+name;
  }

  public String setMethodName(String fieldName){
    byte[] buffer = fieldName.getBytes();
    buffer[0] = (byte)(buffer[0]-32);
    String name = new String(buffer);
    return "set"+name;
  }

3.GetEntity.java

/**
* T为实体对象,可以是由属性和setter/getter组成的实体类,这里要求属性名和查询的数据库字段名相同(顺序可以不一致)
* @author zhzhair
* @param <T>
*/

public class GetEntity<T> extends BasicDao{
  /**
  * @todo 获取实体对象,T为实体类,sql为sql语句字符串,param为sql中传的参数
  * @return T
  */
  public T getEntity(Class<T> clazz, String sql, Object[] param) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
      Field[] fields = clazz.getDeclaredFields();//实体类(POJO)的属性数组(Declared表示按照顺序)
      conn = getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < param.length; i++) {
        ps.setObject(i+1, param[i]);
      }
      rs = ps.executeQuery();
      if (rs.next()) {
        T entity = clazz.newInstance();//创建实例(给实体类分配内存)
        ResultSetMetaData rsmd = rs.getMetaData();//获取数据库表的元数据信息
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          String columnName = rsmd.getColumnName(i);//数据库表的字段名(按照顺序)
          for (Field f : fields) {
            if (columnName.equalsIgnoreCase(f.getName())) {
              Object columnValue = rs.getObject(columnName);//根据属性名获取值
              String methodName = setMethodName(f.getName());//实体的属性名首字母必须小写,获取get方法名
              Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法
              method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)
            }
          }
        }
        return entity;
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      close(rs, ps, conn);
    }
    return null;
  }
  /**
  * @todo 获取实体对象的列表,sql为sql语句字符串,param为sql中传的参数
  * @return List<T>
  */
  public List<T> getEntityList(Class<T> clazz, String sql, Object[] param) {
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    List<T> entities = new ArrayList<T>();
    try {
      Field[] fields = clazz.getDeclaredFields();//bean属性的数组(按照顺序)
      conn = getConnection();
      ps = conn.prepareStatement(sql);
      for (int i = 0; i < param.length; i++) {
        ps.setObject(i+1, param[i]);
      }
      rs = ps.executeQuery();
      while (rs.next()) {
        T entity = clazz.newInstance();
        ResultSetMetaData rsmd = rs.getMetaData();
        for (int i = 1; i <= rsmd.getColumnCount(); i++) {
          String columnName = rsmd.getColumnName(i);
          for (Field f : fields) {
            if (columnName.equalsIgnoreCase(f.getName())) {
              Object columnValue = rs.getObject(columnName);
              String methodName = setMethodName(f.getName());
              Method method = clazz.getMethod(methodName,f.getType());//根据get方法名和属性的类型返回get方法
              method.invoke(entity, columnValue);//唤醒get方法(让get方法生效)
            }
          }
        }
        entities.add(entity);
      }
      return entities;
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      close(rs, ps, conn);
    }
    return null;
  }
}

封装jdbc让你轻松理解Java反射机制

标签:password   statement   目录结构   invoke   实例   技术分享   auto   ase   ret   

热心网友 回答时间:2022-05-02 02:15
Java中的反射机制,通俗点解释就是能够在程序运行中动态获取到内存中任一对象的信息,这些信息包括对象所属类、类中的方法和属性、以及它们的访问控制域和返回值类型等等,还可以通过反射动态调用对象中的方法,而不管该方法的访问域是私有或是公开,包括构造方法,还能实现动态代理等。总之,反射能够破坏掉JAVA类本身的封装性,进而获取其私有的或公开的信息,也就能突破封装进而调用私有的或公开的方法。
实现的话就是通过反射接口,JAVA把反射相关的类接口都封装在了java.lang.reflect这个包中,你可以研究下这个包中的类,对于类的每一个属性,如变量、方法,构造方法,这个包中都就与之相对应的类,通过这个类就可以操作这个属性了。
java反射很强大,但也很危险,在实际开发中应少用或不用,在必要用之时,往往也能解决你遇到的问题。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关推荐
  • java反射机制及动态代理

    java反射机制及动态代理

    java反射机制及动态代理:目前正在看Hadoop RPC框架的源码,在深入了解这些之前,有一些基础知识需要回顾下。 1. java反射机制及动态代理 2. java网络编程 3. java NIO 先总结下第一个,java反射机制及动态代理的相关知识点: java反射机制 在看与java反射机制相关的代码前,试着
    查看详情
java的反射是基于怎样的原理 java反射机制的实现原理 vivo智能手机下载软件怎么打不开? 为什么VIVOy27手机新下载的软件安装后都显示停止运行,重启也不行,怎么办? vivo下载的软件打不开,还显示让通知vivo是怎么回事呀? vivo手机为什么突然打不开应用了。 vivo软件打不开怎么办 vivoY85下载软件打不开白屏? vivo智能手机下载东西软件怎么打不开? 手vivo突然很多软件 无响应打不开 vivo手机软件下载下来却打不开 为什么vivo的很多软件暂停打不开 为什么vivo手机下载的软件打不开? vivo软件找不到,无法打开,显示已经成功安装,请到设置中确认? - 信息提示 vivo手机出现部分app打不开 为什么vivoX7有些软件明明安装了却打不开? 为什么vivo手机好多应用程序打不开? vivoy3r手机下载的软件打不开怎么办 为什么华硕笔记本电脑开机后黑屏,有何解决方法吗 java中反射原理,和应用 如何理解Java反射机制 java的反射机制到底是什么意思 能说一下java的反射机制吗 java的反射技术有什么用? Java中的反射机制的原理和用途是什么? Java中的反射机制是什么 我看的秘密糊糊,看不懂 Java Reflection (JAVA反射)机制详解 java中的反射机制是什么?有什么作用呢?求解,谢谢。 什么是JAVA的反射机制?有什么作用? 为什么使用java反射 linux系统下怎么连wifi? 如何在linux上接收wifi图象 linux系统怎么连wifi 如何在Linux系统下开启无线网络? 请问在WPS的表格中,如何给一排函数的结果求和? VM下的linux如何用wifi无线上网 EXCEL或WPS如何将数据分类求和统计? 物理机linux如何连接有线网和无线网? 虎牙直播首充初体验挂件在哪
Top