package com.itheima;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/**
* 8、 已知一个类,定义如下:
package cn.itcast.heima;
public class DemoClass {
public void run()
{
System.out.println("welcome to heima!");
}
}
(1) 写一个Properties格式的配置文件,配置类的完整名称。
(2) 写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,用反射 的方式运行run方法。
*
* @author 王建伟
*
*/
public class Test8 {
public static void main(String[] args) throws Exception {
// method();
method1();
}
public static void method() throws Exception{
Properties pro=new Properties();
//--------用InputStream加载配置文件-----------------------------------------------------------------------------
//写了相对路径加载Test8.properties
//用FileInputStream,这三种路径都可以
FileInputStream fis1=new FileInputStream(new File("src/com/itheima/Test8.properties"));
FileInputStream fis2=new FileInputStream(new File("/com/itheima/Test8.properties"));
FileInputStream fis3=new FileInputStream(new File("com/itheima/Test8.properties"));
// pro.load(fis1);//加载properties文件
// fis1.close();//关闭流
// pro.load(fis2);//加载properties文件
// fis2.close();//关闭流
// pro.load(fis3);//加载properties文件
// fis3.close();//关闭流
//----------用加载器getClassLoader()加载--------------------------------------------------------------------------
//用类加载期的方式加载properties文件
InputStream is1=Test8.class.getClassLoader().getResourceAsStream("src/com/itheima/Test8.properties");
InputStream is2=Test8.class.getClassLoader().getResourceAsStream("/com/itheima/Test8.properties");
InputStream is3=Test8.class.getClassLoader().getResourceAsStream("com/itheima/Test8.properties");
// pro.load(is1);//加载properties文件
// is1.close();//关闭流
//
// pro.load(is2);//加载properties文件
// is2.close();//关闭流
//
// pro.load(is3);//加载properties文件
// is3.close();//关闭流
//---------直接用类文件加载,其实里面就是封装了getClassLoader()方法----------------------------------------------------------------------------
InputStream iss1=Test8.class.getResourceAsStream("Test8.properties");//可以用相对路径
InputStream iss2=Test8.class.getResourceAsStream("resource/Test8.properties");//可以用相对路径,在下一级文件夹中
InputStream iss3=Test8.class.getResourceAsStream("com/itheima/resource/Test8.properties");//也可以用绝对路径,这三种路径都是可以 的
InputStream iss4=Test8.class.getResourceAsStream("/com/itheima/resource/Test8.properties");//也可以用绝对路径,这三种路径都是可以 的
InputStream iss5=Test8.class.getResourceAsStream("src/com/itheima/resource/Test8.properties");//也可以用绝对路径,这三种路径都是可以 的
// pro.load(iss1);//加载properties文件
// iss1.close();//关闭流
// pro.load(iss2);//加载properties文件
// iss2.close();//关闭流
pro.load(iss5);//加载properties文件
iss5.close();//关闭流
String path=(String)pro.get("className");//因为我定义的key,我就直接通过可以获取值了
System.out.println("-----------"+path);//打印获取出来的value,即类的路径
Class<?> cla=Class.forName(path);//通过字符串加载类
Method m=cla.getMethod("run");//调用类中的方法
m.invoke(null);//执行
}
public static void method1() throws Exception{
Properties p=new Properties();
InputStream is=new FileInputStream(new File("src/com/itheima/Test8.properties"));
p.load(is);
is.close();
String className=p.getProperty("className");
DemoClass name=(DemoClass)Class.forName(className).newInstance();
name.run1();
}
}
//根据题意,我改动了一下题目中的类
class DemoClass {
public static void run(){
System.out.println("welcome to heima!");
}
public void run1(){
System.out.println("welcome to heima!!!!!!!!!!!!!!!!!!");
}
}
对应properties文件中的内容为:
className=com.itheima.DemoClass