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) ;//调用该方法
}
}