JAVA,以下哪个类封装了对容器的常用操作?请给出详细解答,谢谢
C
看到这里会觉得反射很麻烦,没有体现出它的价值。接下来看个案例,就会一目了然了。这个案例就是写一个类,在不改变该类任何代码的前提下,可以帮助我们创建任意类的对象,并且执行其中任意方法。
步骤:
1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件
2. 在程序中加载读取配置文件
3. 使用反射技术来加载类文件进入内存
4. 创建对象
5. 执行方法
Student类:
@NoArgsConstructor
public class Student {
public void sleep(){
System.out.println("睡觉");
}
}
pro.properties配置文件:
className=com.lyp.domain.Student
methodName=sleep
ReflectTest类:
public class ReflectTest {
public static void main(String[] args) throws Exception {
// 前提:不能修改该类的代码
// Student s = new Student();
// s.sleep();
// 1.加载配置文件
// 1.1 创建Properties对象
Properties pro = new Properties();
// 1.2 加载配置文件,转化为一个集合
// 1.2.1 获取class目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();//通过类加载器将字节码文件加载进内存
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
// 2.获取配置文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
// 3.加载该类进内存
Class cls = Class.forName(className);
// 4.创建对象
Object o = cls.newInstance();
// 5.获取方法对象
Method method = cls.getMethod(methodName);
// 6.执行方法
method.invoke(o);
}
}
运行结果:
将需要生成的对象的信息放在配置文件中,这样我们不需要去修改ReflectTest的代码,只需要修改配置文件中className,methodName即可;如果不使用配置文件,就需要在ReflectTest类中写死,Student s = new Student(); s.sleep();那如果想要生成别的对象每次都需要去找到ReflectTest类,修改Student为别的类。使用反射后,增加了程序的灵活性,避免将代码写死,降低了耦合性。在框架的设计思想里用到的就是反射。