第
深入剖析Java中的反射,由浅入深,层层剥离!
之前更新了不少Java的基础知识,比如Java的类、对象、基础类型、关键字、序列化、泛型、值传递等等,今天要上点深度了,来聊一聊Java中的反射!
所谓反射,就是在运行时分析、检查和操作类、接口、方法、属性的行为!
简单感受一下反射
在开始详解反射之前,我们先通过一段代码,简单的感受一下反射的魅力!首先,我们已经写了一个Person类,类中有age和name属性,并提供了set/get方法。这时候分别通过正常的实例化对象调用,和反射调用去操作对象的属性值!
publiccom.javabuild.server.pojo.Person()
---------------
publiccom.javabuild.server.pojo.Person()
publiccom.javabuild.server.pojo.Person(int)
publiccom.javabuild.server.pojo.Person(int,java.lang.String)
----------------
publiccom.javabuild.server.pojo.Person(int)
【步骤三】
通过Constructor对象初始化反射类对象
//通过newInstance()进行实例化
Objecto=constructor.newInstance();
【步骤四】
获取要调用的方法的Method对象
//通过class获取类的元数据-setName/getName方法
MethodsetName=classa.getMethod(setName,String.class);
MethodgetName=classa.getMethod(getName
【步骤五】
通过invoke方法进行方法调用
setName.invoke(o,JavaBuild-反射
以上即为反射使用的全过程!下面贴一下全量代码。
Person类
publicclassPerson{
privateintage;
privateStringname;
publicintgetAge(){
returnage;
publicvoidsetAge(intage){
this.age=age;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
//无参构造
publicPerson(){
//一个参数构造
publicPerson(intage){
this.age=age;
//2个参数构造
publicPerson(intage,Stringname){
this.age=age;
this.name=name;
反射测试类
publicclassTest{
publicstaticvoidmAIn(String[]args)throwsClassNotFoundException,NoSuchMethodException,IllegalAccessException,InvocationTargetException,InstantiationException{
//Java正射实现
Personperson=newPerson();
person.setName(JavaBuild-正射
System.out.println(person.getName());
//Java反射实现
//获取类的class对象
Classclassa=Class.forName(com.javabuild.server.pojo.Person
//通过class获取类的元数据-setName/getName方法
MethodsetName=classa.getMethod(setName,String.class);
MethodgetName=classa.getMethod(getName
//获取默认空构造方法
Constructorconstructor=classa.getCon