反射
起源
在计算机学中,反射式编程(reflective programming)或反射(reflection),是指计算机程序在运行时(runtime)可以访问,监测和修改它本身状态或行为的一种能力。用比喻来说,反射就是计算机程序在运行时可以观察并且修改自己的行为。
Java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java的反射机制。
用法
Apple apple = new Apple();
apple.setColor("red");
System.out.println(apple.getColor());// red
-----------------------------------------------------
Class<?> clz = Class.forName("cn.com.反射.Apple");
Method setColorMethod = clz.getMethod("setColor", String.class);
Constructor<?> constructor = clz.getConstructor();
Object instance = constructor.newInstance();
setColorMethod.invoke(instance, "black");
Method getColorMethod = clz.getMethod("getColor");
Object invoke = getColorMethod.invoke(instance);
System.out.println(invoke);// black
上述两段代码的结果分别是red和black,它们的功能作用是一样的,都是先给一个apple对象设置属性,然后在获取属性。
案例
下面的案例是我对公司目前的代码的简单抽象转化。目前博主这边的项目中要用到多数据库,需求是如果客户在页面上选择指定的数据库类型后,后台数据库就要切换到相应的目标数据库。比如客户指定数据库类型为mysql,则后台切换为mysql数据库,数据也相应的写入到mysql中。如果指定为oracle,则写入到oracle中。
package cn.com.反射;
public class TestDBDemo {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String type;
String linkType = "db2";
switch (linkType){
case "mysql":
type = "cn.com.反射.MySqlDBSql";
break;
case "oracle":
type = "cn.com.反射.OracleDBSql";
break;
case "db2":
type = "cn.com.反射.DB2DBSql";
break;
default:
type = "cn.com.反射.MySqlDBSql";
}
DataBaseSql dbSql = (DataBaseSql) Class.forName(type).newInstance();
String res = dbSql.insertSql();
System.out.println(res);
}
}
package cn.com.反射;
public interface DataBaseSql {
String insertSql();
}
package cn.com.反射;
public class MySqlDBSql implements DataBaseSql{
@Override
public String insertSql() {
String res = "this is mysql...";
return res;
}
}
package cn.com.反射;
public class OracleDBSql implements DataBaseSql{
@Override
public String insertSql() {
return "this is oracle...";
}
}
在程序运行过程中,如果客户切换了指定的数据库类型,那么上述代码写法就可以做到切换数据库的要求。以上的案例就是Java反射的一个小小实践方式。
当然我们日常用到的框架中也有很多反射的用法,比如spring的XML解析,hibernate等等。