在上一篇文章中说说java反射(1)我们已经了解了反射的基本概念以及它的原理,但是我们知道反射只能能用它来做些什么呢?
其实在我们很多已经很熟的框架中都有它的身影,例如Hibernate框架中的关联映射,Spring框架:IOC(控制反转).反射可以实现各种框架功能,接下来我们通过一个实例来写一个很小很小的框架,通过此例子来理解反射真正的价值所在.
接下来的例子主要功能是通过java反射来获取配置文件中的信息.通过配置文件,在程序运行的时候实例化所需要的类型的实例.
首先先建立一个资源文件,这里我们用config.properties来进行配置相关信息.
config.properties文件内容如下:指定类型为ArrayList类型.
- ClassName=java.util.ArrayList
接下来建立一个反射测试类:
- package com.tgb.java;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Collection;
- import java.util.Properties;
- /**
- * 通过一个小例子来演示通过反射技术实现一个简单的框架.
- *
- * @author jnqqls
- * @group TGB
- * @version 1.0
- *
- * @comments
- */
- public class ReflectTest {
- /**
- * @param args
- * @throws IOException
- * @throws ClassNotFoundException
- * @throws IllegalAccessException
- * @throws InstantiationException
- */
- public static void main(String[] args) throws IOException,
- InstantiationException, IllegalAccessException,
- ClassNotFoundException {
- // 将文件读入数据流
- InputStream ipt = new FileInputStream("config.properties");
- // 创建Properties对象
- Properties ppt = new Properties();
- // 将数据流载入到ppt对象中.
- ppt.load(ipt);
- // 关闭占用资源.
- ipt.close();
- // 获取配置文件中的名字.
- String className = ppt.getProperty("ClassName");
- // 通过反射创建className所对应的类的一个实例.
- @SuppressWarnings("unchecked")
- Collection<String> collections = (Collection<String>) Class.forName(
- className).newInstance();
- collections.add(new String("a"));
- collections.add(new String("b"));
- System.out.println(collections.size());
- }
- }
通过测试,输出的数字为2.也就是集合中有两个对象.这里和我们通常的new是不一样的概念,我们的例子是在运行时所创建的对象,而我们常用的new是在编译的时候所生成的对象,因为可以配置我们想要的类型和生成的对象,这便为各种框架提高了支撑.
现在对框架有了一个最简单的例子,通过对反射有了一定的了解便会更进一步的了解Spring框架,对于Spring框架的铺垫就是这些.接下来会继续介绍Spring框架的使用.
Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。调用 forName("X") 将导致命名为 X 的类被初始化。
03 |
public class ClassTest
{ |
04 |
public static void main(String[]
arg){ |
06 |
Class
userClass = Class.forName("com.java.jvm.User"); |
07 |
System.out.println("userClass="+userClass); |
08 |
User
user = (User) userClass.newInstance(); |
09 |
System.out.println("user="+user); |
10 |
} catch (ClassNotFoundException
e) { |
12 |
} catch (InstantiationException
e) { |
14 |
} catch (IllegalAccessException
e) { |
打印结果:
1 |
userClass=class com.java.jvm.User |
2 |
user=User
[name=null,
age=null,
address=null] |
Class.forName("")返回的是类(Class)
Class.forName("").newInstance()返回的是object 其实和new
的关键字作用相同。
调用 forName("X") 将导致命名为 X 的类被初始化,这句话是官网API上的一句话,很迷茫,有点不理解,所以在User类中,添加了static语句块和User构造函数
06 |
System.out.println("static
---"); |
10 |
System.out.println("name="+name); |
16 |
private String
address; |
18 |
public String
getName() { |
21 |
public void setName(String
name) { |
24 |
public Integer
getAge() { |
27 |
public void setAge(Integer
age) { |
30 |
public String
getAddress() { |
33 |
public void setAddress(String
address) { |
34 |
this.address
= address; |
37 |
public String
toString() { |
38 |
return "User
[name=" +
name + ",
age=" +
age + ",
address=" +
address |
结果打印:
2 |
userClass=class com.java.jvm.User |
4 |
user=User
[name=xiaotian, age=null,
address=null] |
forName("X") 执行的时候,调用了User中的静态语句块,newInstance()执行的时候调用了构造函数。
连接数据库的简单代码
02 |
String
driver = "com.mysql.jdbc.Driver"; |
04 |
//
URL指向要访问的数据库名student |
05 |
String
url = "jdbc:mysql://127.0.0.1:3306/student"; |
11 |
String
password = "root"; |
15 |
Class.forName(driver); |
18 |
Connection
conn = DriverManager.getConnection(url, user, password); |
21 |
System.out.println("Succeeded
connecting to the Database!"); |
24 |
Statement
statement = conn.createStatement(); |
27 |
String
sql = "select
* from student"; |
30 |
ResultSet
rs = statement.executeQuery(sql); |
其中加载数据库驱动
Class.forName(driver);加载mysql驱动,执行static语句块,使将Driver对象注册到DriverManager中,然后上面就获得了数据库连接
01 |
package com.mysql.jdbc |
03 |
public class Driver extends NonRegisteringDriver implements java.sql.Driver
{ |
04 |
//
~ Static fields/initializers |
05 |
//
--------------------------------------------- // A |
06 |
//
Register ourselves with the DriverManager |
09 |
t
ry { //使将Driver对象注册到DriverManager中 |
10 |
java.sql.DriverManager.registerDriver(new Driver()); |
11 |
} catch (SQLException
E) { |
12 |
throw new RuntimeException("Can't
register driver!"); |
16 |
//
----------------------------------------------------------- |
18 |
*
Construct a new driver and register it with DriverManager |
20 |
*
@throws SQLException |
21 |
*
if a database error occurs. |
23 |
public Driver() throws SQLException
{ |
24 |
//
Required for Class.forName().newInstance() |
- 关于java反射里的.class、.getClass()、Class.Forname()
博主在研究java反射这一章节时,曾被三个方法困扰多时,.class..getClass().Class.Forname(),先上代码 这是类A package cn.yonyong.net.tcp. ...
- 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class
另一个篇:获取 类 的 方法 和 属性(包括构造函数) 先贴上Java反射机制的概念: AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它 ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
随机推荐
- wap学习记录
针对移动端浏览器: 大部分的浏览器内核都是webkit内核,对h5和c3的支持非常好 库 国内比较流行的框架 : 妹子UI bootstrap中解决ie8以及以下的h5标签和媒体查询兼容问题的两个库分 ...
- PL/SQL编程接触
1.认识PL/SQL 结构化查询语言(Structured Query Language,SQL)是用来访问和操作关系型数据库的一种标准通用语言,它属于第四代语言(4GL),简单易学,使用它可以很方便 ...
- robot framework常见错误:RIDE运行一次后不显示log
在使用RIDE进行web自动化测试时,会发现经常运行第二遍不显示下方log,如下 原因: 代码使用的是谷歌浏览器.IE浏览器测试,运行一次后chromedriver.exe,IEDriverServe ...
- zoj 2932 The Seven Percent Solution
The Seven Percent Solution Time Limit: 2 Seconds Memory Limit: 65536 KB Uniform Resource Identi ...
- 对于2-sat问题的求解
一.O(n+m) 暴力不多说 二.O(m) 1.构图 2.求图的极大强连通子图 3.把每个子图收缩成单个节点,根据原图关系构造一个有向无环图 4.判断是否有解,无解则输出(退出) 5.对新图进行拓扑排 ...
- hdu 3879 最大密集子图(点和边均带权)(模板)
/* 最大权闭合图,可以用最大密集子图来解速度更快复杂度低 题解:胡伯涛<最小割模型在信息学竞赛中的应用> 点和边均带权的最大密集子图 s-i,权为U=点权绝对值和+边的所有权值 i-t, ...
- Linux(3):linux目录结构
查看系统版本: [root@neo ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@neo ~]# uname -r 2.6. ...
- 跨域访问sessionid不一致问题
在开发过程中遇到这么一个问题,让我花了一个下午的大好时光才解决.但是解决玩之后,发现那么的容易.就是查找资料的时候很费劲.这里把问题记录一下. 问题的产生 流程是这样的,要做一个用户登录的接口.在登录 ...
- Codevs 1497 取余运算== 洛谷P 1226
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k ...
- BZOJ1777: [Usaco2010 Hol]rocks 石头木头
n<=10000的树,节点有初始石头数<=1000,进行这样的游戏:两人轮流行动,我先手,每次可以选一个节点(≠1)把不超过m<=1000个石头移到父亲,最后所有石头都在节点1,没法 ...