JAVA反射(下)

        好,今天讲解一下java反射的第二部分。为了让类对象的读取更加灵活,我们再在reflect包下创建一个配置文件。(我将其命名为refconfig.properties键值对形式)。

        在配置文件中写入多个变量分别对应类名和几个方法名:

sub.className = com.reflect.sub
sub.methodName1 = getName
sub.methodName2 = setName

        还记得我们在上一篇中创建的方法类sub吗?我们先在配置文件中引入三个变量来对应sub类中的类名以及一个无参方法和一个有参方法,待会看看行不行。

        首先读取配置文件,读取配置文件时需要创建一个配置文件对象,拿到类加载器并将其加载进配置文件对象中:

		//创建配置文件的对象
		Properties properties = new Properties();
		//拿到类加载器
		InputStream inp = ref.class.getClassLoader().getResourceAsStream("com/reflect/refconfig.properties");
		//加载进properties对象中
		properties.load(inp);

        需要注意的是,引号中填写的是配置文件所在路径。在使用InputStream前,需要import java.io.InputStream; 导入包。而且实际上“ref.class”这个部可以替换为当前项目中任意一个已经存在的类,因为我的目的是通过类加载器来获取资源,只要这个类的类加载器能访问到目标资源即可。

        有了配置文件对象,可以通过getProperty来获取配置文件中变量的值:

        String claName = properties.getProperty("sub.className");
		String metNameGetName = properties.getProperty("sub.methodName1");
		String metNameSetName = properties.getProperty("sub.methodName2");

        这个时候我们就可以创建类对象了:

Class cla = Class.forName(claName);

        我们来测试一下,还记得我在sub类中放了一个传参构造方法,我们new一个sub类对象:

sub s = new sub("小明",18);

        我们先来试试获取sub类中属性:

        Field[] fie = cla.getDeclaredFields();
		for(Field i:fie) {
			System.out.println(i.getName());
		}

        可以发现确实打印出了sub类中name、age和from三个属性。我们再试试执行无参构造方法,还记得使用invoke来执行方法吗?

Method met1 = cla.getDeclaredMethod(metNameGetName);
System.out.println(met1.invoke(s));

        发现程序做到了sub中getName方法,并返回打印了“小明”。好,我们再试试传参方法:

        Method met1 = cla.getDeclaredMethod(metNameGetName);
		Method met2 = cla.getDeclaredMethod(metNameSetName,String.class);
		met2.invoke(s,"张三");
		System.out.println(met1.invoke(s));

        也打印出了修改后的“张三”。补充一个点,使用getDeclaredMethod方法获取有参方法时,一定要在第二个空填写好参数类型,否则默认找的是无参数方法。

        好,就讲到这里,希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值