文章目录
- 一.反射
- 1.定义
- 2.功能
- 3.应用
- 4.常用类和API
- 5.Class类
- 5.Class实例方式
- 二.相关类及API
- 1.Method类
- 1)invoke方法
- 2.Field类
- 1)给属性赋值
- 3.Constructor类
- 三.Proterties
- 1.定义
- **2.Properties特点:**
- 3.properties配置文件作用
- 4.常用方法
- 5.Java读取Properties文件
一.反射
1.定义
程序可以访问、检测和修改它本身状态或行为的一种能力。
Java的反射机制是在编译时,并不确定哪个类被加载,而是在运行时才加载,这样的特点就是反射
2.功能
在运行时获取一个对象的类信息:访问修饰符、成员、方法、构造及超类的信息。
- 动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。
- 动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。
- 动态修改属性:利用反射机制可以获取到类中的所有成员变量,并可以对其进行修改
3.应用
-
开发框架
IDEA编译时,我们输入一个对象等元素时按
.
会自动罗列它的属性和方法 -
框架(Spring,Mybatis,Hibernate)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象
4.常用类和API
使用java.lang.Class
类,反设制的起源;
当一个类被加载后,Java虚拟机就会自动产生一个Class对象,通过该对象就能获得该对象的方法、成员及构造等信息;
生成java文件会自动生成相应的class文件
实现反射的类,于java.lang.reflect
包中:
类 | 含义 |
---|---|
Method | 代表类的方法 |
Constructor | 代表类的构造方法 |
Field | 代表类的成员变量 |
5.Class类
-
方法:
方法名 备注 public String getName() 返回完整类名带包名 public String getSimpleName() 返回类名 public Field[] getFields() 返回类中public修饰的属性 public Field[] getDeclaredFields() 返回类中所有的属性 public Field getDeclaredField(String name) 根据属性名name获取指定的属性 public native int getModifiers() 获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 public Method[] getDeclaredMethods() 返回类中所有的实例方法 public Method getDeclaredMethod(String name, Class<?>… parameterTypes) 根据方法名name和方法形参获取指定方法 public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造方法 public Constructor getDeclaredConstructor(Class<?>… parameterTypes) 根据方法形参获取指定的构造方法 public native Class<? super T> getSuperclass() 返回调用类的父类 public Class<?>[] getInterfaces() 返回调用类实现的接口集合 public T newInstance() 创建对象 -
newInstance()
通过反射实例化对象
Class<Opertor> aClass = Opertor.class;Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);
5.Class实例方式
- 方式1
Class<?> aClass = Class.forName("java.util.ArrayList");
Method[] methods = aClass.getMethods();
for (Method method : methods) {System.out.println(method);
}
Class<?>[] interfaces = aClass.getInterfaces();
for (Class<?> anInterface : interfaces) {System.out.println(anInterface);
}
-
方式2:
Class<Opertor> aClass = Opertor.class;//Optertor类名Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);
-
方式3:
//getClass()方法 Class<? extends Student> aClass = student.getClass();
二.相关类及API
1.Method类
-
方法:
方法名 备注 public String getName() 返回方法名 public int getModifiers() 获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 public Class<?> getReturnType() 以Class类型,返回方法类型【一般配合Class类的getSimpleName()方法使用】 public Class<?>[] getParameterTypes() 返回方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】 public Object invoke(Object obj, Object… args) 调用方法
//获取类中所有自定义方法Class<Opertor> aClass = Opertor.class;Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法System.out.println(invoke);
1)invoke方法
invoke方法:对带有指定参数的指定对象调用由此 Method 对象表示的基础方法方法.invoke(对象, 实参);
2.Field类
-
常用方法
方法名 备注 public String getName() 返回属性名 public int getModifiers() 获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 public Class<?> getType() 以Class类型,返回属性类型【一般配合Class类的getSimpleName()方法使用】 public void set(Object obj, Object value) 设置属性值 public Object get(Object obj) 读取属性值 public void setAccessible(true) 允许访问私有属性 getDeclaredFields() 迭代所有属性
1)给属性赋值
属性.set(对象, 值);
属性.get(对象);
注意这里使用的是
getDeclaredFields
3.Constructor类
-
常用方法:
方法名 备注 public String getName() 返回构造方法名 public int getModifiers() 获取构造方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】 public Class<?>[] getParameterTypes() 返回构造方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】 public T newInstance(Object … initargs) 创建对象【参数为创建对象的数据】
三.Proterties
1.定义
Properties 类表示了一个持久的属性集,是一个Map体系集合类,因为其继承于Hashtable,而Hashtable继承于Dictionary类,实现了Map接口,所以Properties也保留了其相关特性。
2.Properties特点:
- Properties是Hashtable<Object,Object>的子类;
- Properties类表示了一个可持久的属性集;
- Properties可以保存在流中或从流中加载;
- Properties中每个键和对应的值都是一个字符串(String类型);
- Properties有一个特殊的作用:专门用来加载xxx.properties配置文件。
3.properties配置文件作用
properties配置主要的作用是通过修改配置文件可以方便地修改代码中的参数,实现不用改class文件即可灵活变更参数。
在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释
java运行中java文件会变成class文件,之后无法通过反编译找到原样的代码,这样的话,如果java类中某个参数变更,就很难灵活的实现参数修改,这个时候properties 文件就能很灵活的实现配置,减少代码的维护成本和提高开发效率
4.常用方法
方法 | 说明 |
---|---|
getProperty ( String key) | 用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value |
load ( InputStream is) | 从输入流中读取属性列表(键和元素对)。通过对指定的文件进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索 |
setProperty ( String key, String value) | 调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对 |
store ( OutputStream out, String comments) | 以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去 |
clear () | 清除所有装载的 键 - 值对。该方法在基类中提供 |
5.Java读取Properties文件
Java读取Properties文件的方法有很多,常见有以下几种方式:
使用方式 | 文件位置 |
---|---|
new BufferedInputStream(new FileInputStream("source.properties")) | 项目根目录 |
Class.getClassLoader().getResourceAsStream("source.properties") | src下(ClassPath根) |
Class.getResourceAsStream(String path) |
Properties properties = new Properties();InputStream inputStream = Demo08.class.getClassLoader().getResourceAsStream("config.properties");properties.load(inputStream);String property = properties.getProperty("name");String property1 = properties.getProperty("age");System.out.println("name="+property+"\n"+"age="+property1);
ties.load(inputStream);
String property = properties.getProperty(“name”);
String property1 = properties.getProperty(“age”);
System.out.println(“name=”+property+“\n”+“age=”+property1);