百度百科给出的java反射定义:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
对于任意一一个类,该类所有关键属性就是他的属性和方法; 但是很多时候我们在使用一个类的时候,是显示不知道该类的具体属性的,比方说有这样一个方法(来自Hibernate):
boolean save(Object object);
显然我们在使用该方法的时候是不可能传一个Object进来,而是传一个有实际意义的对象进来,但是对于object这个局部变量我们能获得信息很有限,需要在运行时动态获取该object的所有信息,在这种情况下就会用到反射。
关于反射的底层原理:https://blog.csdn.net/qq_35246620/article/details/75209130
关于反射的使用与拓展
1.Class
首先我们必须要获得一个类对象,该对象会包含你所指的类对象所有属性及方法,获取方式
① 显示获取: Class EmployeeClass=Class.forName("test.Employee" );//通过字符串获得,此时类名必须是类的全限定名
或者:Class EmployeeClass2=Employee.class;//使用类的.class属性
②通过对象获取:
Class EmployeeClass3=new Employee().getClass();
经过我自己的测试,这三种方式获得的Class对象完全相等,且哈希码也完成全相等,故而这三种方式可完全相等的使用,且由此推出,当在加载一个类的时候,该类的Class对象也会被创建,且只会创建一个。
extensions:通过该Class对象我们能获得这个类的什么信息呢:
很有用的信息包含:
获取该类的超类,接口,注解,属性,方法,构造器,被当做泛型使用时的类型参数; 生成该类的一个对象
按顺序如下:
getSuperClass()/getDeclaredSuperClass() //注意此方法只能获得他的直接父类,没有父类的返回它本身,直接父类是Object的 返回Object
getInterface()//返回直接实现的接口
getAnnotation(Class<A>annotationClass)/getDeclaredAnnotation(Class<A> annotationClass)/getAnnotations()/getDeclaredAnnotations() //返回指定的注解对象/所有的注解对象
getConstructor(Class<?>... parameterTypes)/getConstuctors() //返回含指定参数列表的构造器/所有构造器
getField(String name)/getFields()/getDeclaredFields() //返回指定属性/所有公共的或者protected属性/所有已声明的属性
getDeclaredMethod(String name, Class<?>... parameterTypes)/getMethods() //返回指定参数列表和命名的方法/返回所有方法
2.Filed
3.Method