Java Web项目——2.反射案例

一、前驱知识点

1.Properties集合

Map->Hashtable->Properties,Properties集合主要用来存储字符串类型的键和值。

        Properties pro = new Properties();
        pro.setProperty("张三","23");//设置键和值
        String name1 = pro.getProperty("张三");//获取对应键的值,即:张三的值
        System.out.println(name1);

2.Properties的load方法

load方法可以加载字节流,将字节流对应的数据转换进Properties集合。

需要注意的是,在命名配置文件时,要加后缀Properties(前提是用Properties集合读配置文件)

3. 配置文件

创建配置文件时,要选资源包

 4.调试方法

在30行上下设置两个输出语句, 可以判断问题出在30行,可以不通过设置断点调试。

二、案例代码

案例要求: 

package cn.itcast.reflect;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectTest {
    public static void main(String[] args) throws Exception {

        //创建Properties双列集合,用于存放键值数据
        Properties pro = new Properties();
        //Reflect的类加载器
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        //用类加载器的方法找到名字为pro的配置文件,转换成字节流
        InputStream is = classLoader.getResourceAsStream("po.properties");
        /*
        * 另一个方法是 classLoader.getResource() 参数为配置文件的路径
        * */
        //用Properties的load方法加载该字节流,将数据存入Properties集合
        pro.load(is);//抛出异常
        //接下来,用获取类名和方法名
        String className1 = pro.getProperty("className");
        String methodName1 = pro.getProperty("methodName");
        //加载类,类型通配符<?>用于接收forName()的结果,即:类
        Class className2 = Class.forName(className1);
        //创建className2的实例对象
        Object o = className2.newInstance();
        //获取方法对象
        
        /*      错误
        * Method methodName2 = className2.getMethod("methodName1");
        * */
        Method methodName2 = className2.getMethod(methodName1);
        
        methodName2.invoke(o);

        is.close();

    }
}

这里需要注意的是,getMethod方法的参数是字符串,而我们需要获得的是eat方法,即:参数为字符串eat,所以此时参数可以有两种形式:

1.“eat”                2.methodName1  //methodName1就是键methodName对应的值eat

错误示范:“methodName1”(Person类中没有该方法,只有eat方法,所以会有NoSuchMethodException)

(1)调用Person类的eat方法

className=cn.itcast.domain.Person
methodName=eat

配置文件中的内容,注意:方法名和类名的值不需要加引号 

输出:eat...

(2)调用Student类的sleep方法

className=cn.itcast.domain.Student
methodName=sleep

输出:sleep...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值