java dao public <t> t execute_java中的反射详解

一、什么是反射,反射的概念

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

二、反射是怎么实现的

程序运行的时候首先会通过javac把.java文件编译成.class文件,然后保存在硬盘中,当使用new的构造方法来创建一个对象的时候,类加载器就会把数据从硬盘中读入内存,内存的方法区中就会存在这个方法,堆区中会创建一个对象来指向这个方法,这就是反射的实现过程。

程序会在对类第一次使用的时候进行类加载,分为以下五种情况:

1、new一个对象的构造方法

2、new一个类的子类的构造方法

3、调用一个累的static成员变量或方法

4、运行含有main的方法类

5、调用Class.forName("类额完全限定名")

拿到class对象的三种方式

1、Class.forName("类额完全限定名")

2、类名.class

3、对象名.getclass()

User user=newUser();

Class clz=Class.forName("类的完全限定名");

System.out.println(clz);

System.out.println(user.getClass());

System.out.println(User.class);

//输出的结果是完全相等的

举例说明(Jdbc的封装)

普通的jdbc都会很麻烦,每一个表的增删查改都要去挨个写方法,这里我们对数据库的dao层尽心了封装,把逻辑封装成一个jdbcutil实现方法如下:

通过查询所有信息来举例,其他的都类似

public static List executeQuery(String sql,Classclz,Object... params) {//这里参数我们采用数据库语句和泛型类还有需要用到的参数,这里就是采用的反射机制,根据类名.calss来获取对象

List list = new ArrayList();//由于不知道具体对象,这里也采用泛型

Connection con=getConnection();

PreparedStatement pstmt= null;

ResultSet rs= null;try{

pstmt=con.prepareStatement(sql);if(params != null) {for(int i = 0; i < params.length; i++) {

pstmt.setObject(i+ 1, params[i]);

}

}

rs=pstmt.executeQuery();while(rs.next()) {//先创建一个对象

T t =clz.newInstance();//调用无参构造方法//读数据库的值 为 t对象的属性赋值

Field[] fields =clz.getDeclaredFields();//获取类的所有属性for(Field field : fields) {

String fieldname=field.getName();//把属性名 当做字段名 从 rs中 获取数据

try{

Object value=rs.getObject(fieldname);//获取这个属性和值

field.setAccessible(true);//由于实体类的属性可能是private所以要获取权限

field.set(t,value);//把属性和值放到泛型类中

}catch(Exception ex) {

System.out.println(fieldname+ "在数据表中没有这个字段");

}

}

list.add(t);

}

}catch(SQLException e) {

e.printStackTrace();

}catch(IllegalAccessException e) {

e.printStackTrace();

}catch(InstantiationException e) {

e.printStackTrace();

}finally{

close(rs,pstmt,con);

}returnlist;

}

为了方便实用这个封装,下面演示一下其他项目如何导入这个jar包,要注意以下几个地方,然后点install

e5f65087124ef79b1ce688c07ad34014.png

打包成功会有这个信息

9f344c2efda4da40de87647e970e7ea6.png

这个时候就可以去文件里找了

d07b6f3f34a268e85c63aec9c57e8014.png

然后我们就可以导入依赖了 ,直接拿过来就能用

e6287c5b0a9c98e82a30cf2282726c1b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值