如果你即将学Spring SpringMVC Mybatis 等框架的话,那么你应该先学习反射机制
如果你用过了Spring SpringMVC Mybatis等框架的话,若想进一步了解它们的原理的话,你也应该学习反射
我之前呢,已经写过SSM的使用了,如果你没用过SSM的话,可以回顾一下奥
https://blog.csdn.net/JunSIrhl/article/details/104031954
https://blog.csdn.net/JunSIrhl/article/details/104034370
https://blog.csdn.net/JunSIrhl/article/details/104035337
同时,注解与反射在框架开发中地位相同,这是框架的核心基础
https://blog.csdn.net/JunSIrhl/article/details/104017247
本文会对Java的反射机制做一个概述,并详细介绍它的基本使用,并试着阐述反射机制的原理,希望对点进这篇文章你的有帮助
文章目录
What is Reflect
JAVA反射机制(Reflect)是在运行状态中
对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
Class类
我们知道类是具有相同属性或者行为的一类事物,那么类本身也可以再被抽象,因为类们也有共同的属性和行为(比如类都有属性,都有构造器,都有方法,都能调用方法),所以把类们又抽象成了一个类Class
众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()
等。其中getClass()就返回了一个Class 对象
Class 类十分特殊。它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void。
当一个class被加载,或当加载器(class loader)的defineClass()
被JVM调用,JVM 便自动产生一个Class 对象
在学习Class类的过程中我们还需要学习Field类,Method类,Constructor类
Field类:类属性的抽象
Method类:类方法的抽象
Constructor类:类构造器的抽象
必须掌握的操作
获取Class类对象
- 方式一
//根据一个类的全名字符串来获得一个类的类对象
Class<?> clazz = Class.forName("java.util.HashMap");
- 方式二
//obj为任意对象,getClass是所有对象都带的一个方法
Class<?> clazz = obj.getClass();
获得类对象所有方法
//获得传递过来的类的所有方法
Method[] methods = clazz.getDeclaredMethods();
//System.out.println(Arrays.toString(methods));
for(Method m : methods){
System.out.println(m); }
public java.lang.Object java.util.HashMap.remove(java.lang.Object)
public boolean java.util.HashMap.remove(java.lang.Object,java.lang.Object)
public java.lang.Object java.util.HashMap.get(java.lang.Object)//其余方法省略
获取类对象所有属性
Field[] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println(f);
}
private static final long java.util.HashMap.serialVersionUID<