Java反射初体验

反射

起源

在计算机学中,反射式编程(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等等。

你可能感兴趣的:(java,java,反射)