反射
java是面向对象语言,java编译生成的字节码文件应该也是一个对象,这个对象不需要我们定义,
java已经自动定义好了一个类 叫 calss
class类时用来描述事物的,是java最基本的单位,类作为一个概念存在,概念本身也是一个对象
我们使用class类 来描述 这个概念类
反射的好处:通过反射可以获取到字节码文件对象,
使用这个字节码文件对象可以获取到一个类的素有信息,包括私有
【构造方法对象,成员变量对象,成员方法对象,访问权限修饰符对象...】
之前的做法;
new 对象,
学习反射之后: 可以不需要显示出现学生类就能够创建学生类对象,并且可以动态创建对象,动态赋值,动态调用方法
相关对象
Class 类对象
Constructor 构造方法对象
Method 成员方法对象
Field 成员变量对象
Modifier 访问权限修饰符对象
Array 数组对象
如何获取到堆区中的字节码文件对象?
三种方式;
1.通过Object类的getClass方法
缺陷:不许要显示创建对象才能获取到对应的字节码文件对象
2,通过数据类型的class属性
缺点:必须在代码中硬编码,当生产环境下切换类的时候需要修改源代码
优点:
1,不需要创建对象
2,当一个方法的形参需要我们传入的是一个Class类型的时候,用方式二,方便
public void method(Class c){}
method(Student.class)
3,通过Class类的一个静态方法Class.forName()
static Class <?> forName ( String className)
学习目标:
1,通过反射随意的获取一个类的任意信息
2,通过反射书写相关简单的工具类
3,通过反射+注解能够编写简单的框架~~~
通过字节码文件对象来获取构造方法对象
Properties properties = new Properties();
properties.load(new FileReader("config/classinfo.properties"));
String classPath = properties.getProperty("className");
Class<?> c = Class.forName(classPath);
通过反射获取构造方法对象
Constructor<?>[] constructors = c.getConstructors();
获取所有公有修饰的构造方法对象数组
Constructor<?>[] constructors = c.getDeclaredConstrustors();
获取所有构造方法对象数组,包括私有
Constructor<?>[] constructors = c.getConstructor(Class<?>...parameterTypes);
获取无参,全参 构造方法对象
Constructor<?>[] constructors = c.getDeclaredConstructor(class<?>...parameterTypes);
获取私有构造方法对象