1.理解Class类并实例化Class类对象
- 运行时创建类对象并获取类的完整结构
3.通过反射调用类的指定方法、指定属性
/**高内聚低耦合
-
一个类主要包含三部分:成员变量,成员方法,构造方法
-
设计一个类,根据类去创建这个类的对象,根据对象名调用方法,调用属性,构造方法,而反射和我们这种方式就不一样。
-
反射:框架设计的灵魂
-
框架:半成品软件,可以在框架的基础上进行软件开发,简化代码,解耦,
-
反射:讲类的各个组成部分封装成了其他对象,这是反射机制,可以在程序运行中,操作这些对象
-
使用一个类的对象的话,关键点是能够获得这个Class类对象,Class类对象对应的是类的字节码文件
-
获取Class类对象三种方式:
-
1.Class.forName(“全类名”):将字节码文件加载到内存,返回该字节码文件的Class类对象
-
–>多用在配置文件,把类的定义配置在配置文件里面,读取配置文件,加载类
-
2.类名.class:通过类名.class获取Class类对象//已经加载进去了
-
–>多用于参数传递
-
3.对象.getClass():获取,getClass()声明在object类里面的方法//运行阶段,已经有对象了
-
–>多用于对象的获取字节码文件
-
同一个字节码文件(.class)文件在一次程序运行中,只会被加载一次,
-
这个三种方式你不论使用哪种获取class类对象都是同一个
-
class类对象的功能
-
1、获取成员变量们
-
2.获取成员方法们
-
3.获取构造方法们
-
4、获取类名
-
获取成员变量:
-
Field[] getFields() :获取时所有public修饰的成员变量
-
Field getField(String name) :根据变量名获取对应的public成员变量
*Field[] getDeclaredFields() :获取所有的 成员变量,不考虑修饰符 -
Field getDeclaredField(String name) :获取单个的成员变量
-
对成员变量设置值和获取值
-
set(Object obj, Object value) :设置成员变量的值
-
get(Object obj) :获取成员变量值
-
获取构造方法
-
Constructor [] getConstructors():返回所有的构造方法,public
-
Constructor getConstructor(参数类型.class…):根据参数列表获取对应的构造方法 public
-
Constructor getDeclaredConstructor(类… parameterTypes)
-
Constructor getDeclaredConstructors()
-
获取方法:
-
方法[] getMethods():获取所有的方法,public包括父类的
-
方法 getMethod(String name, 参数… parameterTypes):返回指定的方法,public
-
方法[] getDeclaredMethods() :返回所有方法,包含私有的,不包含父类的
-
方法 getDeclaredMethod(String name, 类<?>… parameterTypes) :返回指定方法
*/
//Field getDeclaredField(String name):获取单个的成员变量
Field name = personClass.getDeclaredField(“c”);
//正常是可以获取到私有成员变量,但是会给你报一个错误,因为private有安全检查机制
//如果想要获取,可以:
//忽略访问权限的安全检查机制
name.setAccessible(true);
Object c = name.get§;
System.out.println©;
- 模拟一个框架,不能改变该类的任何代码的前提下,可以帮我创建类的对象,并且
- 可以执行该对象的任何方法
- 实现:
- 1.配置文件 xml
- 2.反射
- 步骤:
- 1.创建配置文件,在配置文件里面定义需要创建类的全类名和需要执行的方法或者属性
- 2.在java程序中加载配置文件,读配置文件里面的相关信息
- 3.使用反射的技术加载文件到内存中
- 4.创建对象
- 5.执行方法或者属性等
public class TestFrame {
public static void main(String[] args) throws Exception {
// Person p=new Person();//存在硬编码的问题
// p.eat();
// Student student=new Student();
// student.sleep();
//1.创建properties对象
Properties properties=new Properties();
// //通过流的方式读取配置文件
// FileInputStream fis=new FileInputStream(new File(“proclass.properties”));
// //将输入流加载到properties对象中
// properties.load(fis);
// fis.close();
//2.加载配置文件,通过类加载器去加载
//类加载器的作用就是把字节码文件加载到内存中,我们就可以通过类加载器
//获取所有的字节码文件,同样也可以获取项目中配置文件
//2.1 获取当前类字节码文件的类加载器(和所有的字节码文件都是同一个类加载器)
ClassLoader classLoader = TestFrame.class.getClassLoader();
//2.2通过类加载器加载配置文件输入流
InputStream is = classLoader.getResourceAsStream("pro.properties");
properties.load(is);
//3.获取配置文件里面的相关配置
String user = properties.getProperty("user");
String password = properties.getProperty("password");
System.out.println(user+"+"+password);
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//4.通过反射获取Class对象(把字节码文件加载到内存中)
Class clazz = Class.forName(className);
//5.创建对象
Object o = clazz.newInstance();
//6.获取对象的方法
Method method = clazz.getMethod(methodName);
//7.调用方法
method.invoke(o);
}
}