加载Properites的配置文件

package com.lin.reflect_02;

import java.io.FileReader;
import java.io.Reader;
import java.lang.reflect.Method;
import java.util.Properties;

/*
 * 反射的应用1:
 *   加载配置文件中内容,获取该类的字节码文件对象--->调用成员方法
 * */
@SuppressWarnings("all")
public class Test1 {
	
	public static void main(String[] args) throws Exception {
		
		//反射之前:
		//创建学生类
		Student student = new Student() ;//Student.class  
		//---class com.qianfeng.reflect_01.test.Student
		student.love(); 
		//创建Woker类对象
		Woker w = new Woker() ;
		w.love();
		
		//设计原则:开闭原则:对修改关闭,对扩展开发(不去修改现用代码,而是提供扩展功能)
		//将Student类/Worker类的全限定名称定义在配置文件中
		System.out.println("---------------------------");
		
		//使用反射改进:
		//读取当前项目下的class.txt文件
		//利用属性集合类操作Properties
		Properties prop = new Properties() ;
		//将文本文件中的内容到属性列表中
		Reader r = new FileReader("class.txt") ;
		prop.load(r);
		//释放
		r.close();
		//System.out.println(prop);
		//遍历Properties属性列表,获取里面键的集合
		//Set<String> set = prop.stringPropertyNames() ;
		//通过className---->包名.类名  "值"
		String className = prop.getProperty("className") ;
		//获取方法名
		String methodName = prop.getProperty("methodName") ;
		
		//通过Class类forName获取字节码文件对象
		Class clazz = Class.forName(className) ;//class com.qianfeng.reflect_02.test.Student
		
		//调用love()方法
		//1)直接创建clazz所在的类的实例对象: public T newInstance() 
		//2)要么创建Constructor构造器 getConstructor()---->newInstance(Object...args):创建该类实例
		
		Object obj = clazz.newInstance() ;
		
		//调用方法,获取方法Method类对象
		Method m = clazz.getMethod(methodName) ;
		
		//调用底层方法
		m.invoke(obj) ;
		
	}
	
}
public class Student {
	
	public void love() {
		System.out.println("爱生活,爱Java...");
	}
}
public class Woker {

	public void love() {
		System.out.println("爱生活,爱抽华子...");
	}
}
package com.lin_reflect_02;

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

/*
 * 在Test2这个类中,加载class.properties配置文件
 * 
 * 	1)src这个目录下(类路径)
 * 	2)读取配置文件:
 * 		当前类名.class---->当前类的字节码文件对象-
 * 		public ClassLoader getClassLoader():获取该类的类加载器
 * 		
 *  	public InputStream getResourceAsStream(String name)
 *  				通过资源名称获取它的输入流对象
 *  
 *  3)Properties属性列表 load(InputStream in)
 *  
 *  4)遍历Properties:获取键和值
 *  5)通过反射获取该类的字节码文件对象
 *  6)调用该类的成员方法
 * */
public class Test2 {
	
	
	public static void main(String[] args) throws Exception {
		//1)读取class.properties配置文件
		//public ClassLoader getClassLoader():获取该类的类加载器
		ClassLoader classLoader = Test2.class.getClassLoader() ;
		//public InputStream getResourceAsStream(String name)
		InputStream inputStream = 
				classLoader.getResourceAsStream("class.properties") ;
		/*
		 * 方式2:获取网络资源地址对象(URL对象)
		 * URL url = classLoader.getResource("class.properties") ;
		String path = url.getPath() ;*/
		
		
		//2)创建属性集合类对象
		Properties prop = new Properties() ;
		prop.load(inputStream); //相当于加载到属性列表中
		//System.out.println(prop);
		inputStream.close();
		
		//3)遍历Properties
		String className = null ;
		String methodName = null ;
		Set<String> set = prop.stringPropertyNames() ;
		for(String key:set) {
			//通过键获取值
			 className = prop.getProperty("className") ;
			 methodName  = prop.getProperty("methodName") ;
		}
		
		//4)获取该类的字节码文件对象
		Class clazz = Class.forName(className) ;
		
		//5)创建该类实例
		Object obj = clazz.newInstance() ;
		//获取Method对象
		Method m = clazz.getMethod(methodName) ;
		m.invoke(obj) ;//调用该方法
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值