引言:从Java5开始,Java中引用了一个新的概念反射,当程序运行时,能动态感知到程序中拥有的所以信息,这个获取信息的过程是采用反射机制来完成。

一、       Class类:

  Class类用于保存Java程序中所有接口、类、数组所编写的所有消息,一旦我们创建以个接口、类、数组时会在Class类中被注册,即保存所有信息。

  当我们需要获取某个接口、类、数组中的信息时就可以先获取他们在Class中注册的对象,通过该对象再调用反射机制提供的一些方法来获取、操作。

二、       获取某个接口、类或数组在Class中注册的对象:

  1. 1.     通过调用getClass()方法获取:

Grade grade = new Grade();

Class gradeClss = grade.getClass();

  1. 2.     通过接口、类访问class静态属性获取:

Class studentClass = Student.class;

  1. 3.     通过全类名的方式获取:

Class driverClass = Class.forName("com.mysql.jdbc.Driver");

三、       通过Class对象调用反射机制提供的方法完成操作:

   1、获取属性、方法、接口、父类等;

/**
* 通过反射获取Grade的属性
* 若调用带有getDeclared开头的方法,表示不管该资源是否是私有的,全部都能访问
*/
@Test
public void testGetFieds() {
Class clazz = Grade.class;
//Field[] fiels = clazz.getFields();
Field[] fiels = clazz.getDeclaredFields();
for (Field field : fiels) {
System.out.println(field.getName());
}
} /**
* 通过反射获取Grade的属性
* 若调用带有getDeclared开头的方法,表示不管该资源是否是私有的,全部都能访问
*/
@Test
public void testGetMedthods() {
Class clazz = Grade.class;
//Field[] fiels = clazz.getFields();
Method[] medthods = clazz.getDeclaredMethods();
clazz.getSuperclass();
for (Method medthod : medthods) {
System.out.println(medthod.getName());
}
}

  2、通过反射创建对象并调用方法:使用用反射创建一个对象StudentDao的实现类对象,并通过该对象调用其中的selectStudentAll()方法。

@Test
public void studentDaoObject() throws Exception {
Class clazz = StudentDaoImpl.class;
Object studentDaoImpl = (StudentDaoImpl)clazz.newInstance();
List<Student> list = ((StudentDao) studentDaoImpl).selectStudentAll();
for (Student student : list) {
System.out.println(student);
} }

四、       Java中默认的几个类加载器:

Java虚拟机(jvm)启动时就会自动启动几个类加载器,它们分别是“系统类加载器”、“扩展类加载器”、“根类加载器”,我们也可以获取到前两个加载器,而“根类加载器”不允许获取。

  1)    “根类加载器”:当JVM启动时加载一些必要的类,如java.lang包中的类。

  2)    系统类加载器”:在JVM启动时加载sun公司提供的一些类,如:Java.util.Date。

  3)    “扩展类加载器”:在JVM启动时加载一些第三方提供的一些类,如:com.mysql.jdbc.Driver。

/**
* 练习类加载器的使用
* 在练习过程中将 获取Java类中的几个类加载器
* 系统、扩展加载器可以获取,根类加载器不允许获取。
*/
@Test
public void testClassLoader() {
//获取系统类加载器:
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println("系统类加载器:" + classLoader); //获取扩展类加载器
ClassLoader extendClassLoader = ClassLoader.getSystemClassLoader().getParent();
System.out.println("扩展类加载器:" + extendClassLoader); //试图获取根类加载器,实则无法获取到
ClassLoader bootClassLoader = ClassLoader.getSystemClassLoader().getParent().getParent();
System.out.println("试图获取根类加载器:" + bootClassLoader); }

五、       通过类加载器加载放置在src下的资源:

  放置在src下的资源不能像放置在webroot下的资源直接通过“/XXX”来获取,而要通过类加载器才能获取到。

  案例:针对BaseDao的改造:

  需要将写死在BaseDao中连接数据库的4个参数:驱动(driverClass)、url(jdbcurl)、用户名(user)、密码(password)移到一个属性文件(db.properties)中,在  BaseDao中通过类加载器将db.properties加载进来,还需要一个properties的工具类来读取db.properties中的内容。

db.properties  :在项目下新建一个Source Folder文件夹,名为config,在文件夹下新建名为db.properties的file,如果以后要修改数据库信息,就可以直接在这个文件中进行修改。

driverClass = com.mysql.jdbc.Driver
jdbcurl = jdbc:mysql://127.0.0.1:3306/myschool39
user = root
password = root #driverClass = oracle.jdbc.driver.OracleDriver
#jdbcurl = jdbc:oracle:thin:@127.0.0.1:1521:orcl
#user = user39
#password = root #driverClass = com.microsoft.sqlserver.jdbc.SQLServerDriver
#jdbcurl = jdbc:sqlserver://127.0.0.1:1433;databaseName = sqlserver
#user = sa
#password = root

BaseDao.java

package com.oop.util;

import java.io.InputStream;
/*
* BaseDao类定义三个属性(Connection、PreparedStatement、ResultSet类型)和
* 两个方法:获取连接的方法getConnection()、关闭资源的方法closeAll。
*/
import java.sql.*;
import java.util.Properties; public class BaseDao {
// 三个属性
protected InputStream inputStream = null; protected Connection ct = null;
protected PreparedStatement pst = null;
protected ResultSet rs = null; // 获取连接
protected Connection getConnection() {
try { //0、从db.properties属性文件中获取连接数据库的四个参数值
// com/oop/util/db.properties 如果属性文件在util包下的使用方法 inputStream = this.getClass().getClassLoader().getResourceAsStream("db.properties");
Properties properites = new Properties();
properites.load(inputStream);
String driverClass = properites.getProperty("driverClass");
String jdbcurl = properites.getProperty("jdbcurl");
String user = properites.getProperty("uset");
String password = properites.getProperty("password"); // 1---加载(注册)驱动:指定需要链接的是哪种数据库管理系统
/*
* 用Class类直接调用forName(String className)方法
* 获取Driver类在Class中注册的对象,通过该对象可以利用“反射机制”获取到Driver类中的所有信息。
*/
Class.forName(driverClass); // 2---获取与数据库链接:需要指定URL(jdbc:mysql://127.0.0.1:3306/数据库名)、user、password。
// 返回值需要用一个connection接口实现类的对象ct接收
ct = DriverManager.getConnection(jdbcurl, user, password);
} catch (Exception e) {
e.printStackTrace();
} return ct; } //关闭资源
protected void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (ct != null) {
ct.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

java oop第11章_反射、BaseDao的进一步改造的更多相关文章

  1. Java oop 第13章_多线程

    第13章_多线程 一.   多线程相关的概念:  程序:由某种编程语言开发可执行某些功能的代码组合,它是静态的概念.   进程:当程序被执行时的过程可以理解为讲程序从外存调入内存的过程,会为每一个程序 ...

  2. java oop第07章_集合框架

    一. 什么是集合: 在Java中提供了一些可以保存同一数据类型的数据集称为集合,就是规定了一些集合的规范(接口.抽象类.实现类)及方法, 方便我们程序在保存数据时进行增.删.改.查操作,编程更加高效. ...

  3. java oop第06章_异常处理

    一. 异常的概念: 若程序都按我们事先设定的计划运行为正常执行,但通常会出现我们事先预料之外的其他情况,称为程序发生异常, 在java中会对一些可能出现异常的代码进行分类,达到尽量对可能发生的异常进行 ...

  4. Java oop第05章_多态、接口

    一. 为什么需要接口? Java中当一个类继承父类时,最多也只能继承一个父类,扩展性会受到一定的限制,为了弥补这一缺陷,Java又提供了一种新的引用数据类型分类,叫接口. 一个类只能继承一个父类,但可 ...

  5. java OOP第03章_继承、抽象类和抽象方法

    一. 为什么需要继承: 若多个类中都需要一些属性和方法,那么就可以将属性和方法抽取到一个父类中,需要的子类可以通过extends关键字去继承这个父类后拥有相应的属性和方法. 类.数组.方法----引用 ...

  6. 全国计算机等级考试二级教程-C语言程序设计_第11章_对函数的进一步讨论

    无论传递什么参数,函数都有副本机制 改变一个变量,需要传入变量的地址 改变一个指针变量,需要传入指针变量的地址 //int add(int a, int b);挖取函数声明 //int ()(int ...

  7. java oop第09章_JDBC02(CRUD操作)

    第09章_JDBC02(CRUD操作) CRUD(CREATE . RETIVE . UPDATE . DELETE)增删改查. DAO中会提供一些CRUD操作方法,调用者可以通过调用这些方法完成相应 ...

  8. java oop第14章_Swing(Java界面设计)

    一.   Swing相关的概念: 1.  GUI:(Graphical User Interface):图形化用户界面,通过图形化的方式提供与用户交互的平台,向用户展示信息.收集用户提交的数据. 2. ...

  9. java oop第10章_JDBC03(MVC分层模式)

    引言:在进行程序开发的时候,为了更加利于程序的管理我们引入了新的开发模式MVC分层模式,即按功能将程序代码分别分为M(Model模型).V(View视图).C(Controller控制器)三个组成部分 ...

随机推荐

  1. 数据批量导入HBase

    测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei ...

  2. spring自学历程

    spring几大核心功能 1.IOC/DI(控制反转/依赖注入) IOC是什么?IOC完成的事情是原先程序员主动通过new实例化对象的事情,转交给spring负责 IOC最大的作用是:解耦,程序员不需 ...

  3. 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法

    1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...

  4. 使用Maven进行依赖管理和项目构建

    什么是Maven 1 依赖的管理:仅仅通过jar包的几个属性,就能确定唯一的jar包,在指定的文件pom.xml中,只要写入这些依赖属性,就会自动下载并管理jar包. 2 项目的构建:内置很多的插件与 ...

  5. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

  6. 62. File类常用方法

    为了怕混淆,先说明一些下面要出现的名词意思:例如:D:\\新建文件夹 (2)\\a.txt 和  D:\\新建文件夹 (2)\\aaaa D:\\新建文件夹 (2)   父路径    a.txt    ...

  7. mybatis快速搭建

    结构图 1.创建maven项目 2.引入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mys ...

  8. Tomcat---概述

    1.Tomcat  是  一个  免费.开源  的 web应用服务器: 属于  轻量级  应用服务器,在中小型系统.并发量不大的情况下  被广泛使用: 2.Tomcat 是  Apache下的核心项目 ...

  9. php操作redis--字典(hash)篇

    常用函数:hSet,hGet,hGetAll等. 应用场景:存储用户信息对象数据,包括id,姓名,年龄和生日,通过用户id来获取姓名,年龄等信息. 连接 $redis = new Redis(); $ ...

  10. 每天一个Linux命令:man(0)

    man man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助.配置文件帮助和编程帮助等信息. 格式 man [-adfhktwW] [section] [-M path] ...