反射
反射
1.定义:
将类的各个组成部分封装为其他对象
(将类的各个组成部分封装为其他对象)
2.优点:
1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性
3.获取Class类对象的方式
1.Class.forName(“全类名”),将字节码文件加载进内存,多用于配置文件;
2.类名.class:通过类名的calss属性,多用于参数传递;
3.对象.getClass():在Object对象中定义;用于对象的获取字节码的方式;
【同一个字节码文件,在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取得Class对象都是同一个】
4.Class对象功能:
·获取功能:
获取成员变量
获取构造方法
构造器用来创建对象,也可以直接用Class对象.newInsance(只能使用空参构造方法)
构造器.newInstance();(含参构造)
获取成员方法
获取类名
5.反射案例演示
例:我们写一个”框架“,即一个不通过改动代码而能实现传递不同参数的要求的特殊类,能实现指定类的方法。
我们需要编写一个类,能帮我们实现为某一个指定的类创建对象,并且执行这个类中指定的方法,不是通过传统的方法去实现,因为我们会注入不同的类,而且这个类一旦编写成功,就不会再去改里面的代码,是通过改配置文件来实现不同的功能。
创建Person类和Student类,并分别含有方法study()和eat()
public class Person {
private String name;
public void study(){
System.out.println("学习使我快乐");
}
}
public class Student {
private String name;
public void eat(){
System.out.println("干饭人,干饭魂");
}
}
编写配置文件;pro.properties,【后缀名必须为properties】
className=com.yf.pojo.Person
methodName=study
编写这个特殊的类
public class Demo02 {
public static void main(String[] args) throws Exception {
//1.加载配置文件
//1.1
Properties properties = new Properties();
ClassLoader classLoader = Demo02.class.getClassLoader();
InputStream rs = classLoader.getResourceAsStream("pro.properties");
properties.load(rs);
//从配置文件中获取信息
String cl = properties.getProperty("className");
String md = properties.getProperty("methodName");
//System.out.println(cl+"=="+md);
//获取Class对象
Class acl = Class.forName(cl);
//创建对象
Object obj= acl.newInstance();
//获取方法
Method method = acl.getMethod(md);
//执行方法
method.invoke(obj);
}
}