最通俗的反射讲解,学反射理解这篇就差不多了。
反射机制
是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意属性和方法; 这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
注意:
- 知道这个类的所有属性和方法/都能够调用它的任意属性和方法: 之前用private封装的属性,外界创建的对象调用不了,只能通过调用public方法来间接获取这个对象。反射就是说,用反射的方式创建对象,就是什么都可以调用到。
- 动态获取信息/动态调用方法:
利用反射调用它类中的属性和方法,无视修饰符。
先获取配置文件中的信息,动态获取信息并创建对象和调用方法。
public class ClassLoaderDemo2 {
public static void main(String[] args) throws IOException {
//static ClassLoader getSystemClassLoader() 获取系统类加载器
//InputStream getResourceAsStream(String name) 加载某一个资源文件
//==============读取prop配置=============
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加载器去加载一个指定的文件 //参数:文件的路径(放在src的根目录下,默认去那里加载) //返回值:字节流。
InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
is.close();
//用反射创建对象并调用方法。
Class clazz = Class.forName("com.itheima.myreflect2.Student");
//利用构造器创建对象
Constructor constructor = clazz.getConstructor();
Object o = constuctor.newInstance();
//获取方法对象
Method methods = clazz.getMethod(prop.getProperty("methonName));
//运行方法
method.invoke(o);
}
}
properties里面写的是className=“包名+类名”,methodName=方法名
获取class类对象的三种方式
先上一张图。
这张图形象的介绍了代码三个阶段获取Class对象的方法。
- Class.forName(“包名+类名”):推荐这种用法,在硬盘阶段获取字节码对象。
- 类名.class:这个时候类已经加载到内存了,但未创建对象。
- 对象.getClass:这个已经创建过对象了,个人感觉这种用法意义不大。
获取构造方法
方法名 | 说明 |
---|---|
Constructor<?>[]getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[]getDeclaredConstructors() | 返回所有构造方法对象的数组 |
ConstructorgetConstructor(Class<?>…parameterTypes) | 返回单个公共构造方法对象 |
ConstructorgetDeclaredConstructor(Class<?>…parameterTypes) | 返回单个构造方法对象 |
Constructor用于创建对象的方法
方法名 | 说明 |
---|---|
TnewInstance(Object…initargs) | 根据指定的构造方法创建对象 |
setAccessible(booleanflag) | 设置为true,表示取消访问检查 |
获取成员变量
方法名 | 说明 |
---|---|
Field[]getFields() | 返回所有公共成员变量对象的数组 |
Field[]getDeclaredFields() | 返回所有成员变量对象的数组 |
FieldgetField(Stringname) | 返回单个公共成员变量对象 |
FieldgetDeclaredField(Stringname) | 返回单个成员变量对象 |
Field类用于给成员变量赋值的方法
方法名 | 说明 |
---|---|
voidset(Objectobj,Objectvalue) | 赋值 |
Objectget(Objectobj) | 获取值 |
获取成员方法
方法名 | 说明 |
---|---|
Method[]getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[]getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(Stringname,Class<?>…parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(Stringname,Class<?>…parameterTypes) | 返回单个成员方法对象 |
Method类用于执行方法的方法
方法名 | 说明 |
---|---|
Objectinvoke(Objectobj,Object…args) | 运行方法 |