新手 java 的反射

新手上路,请祝我一路顺风,请多指教



反射,反过来设计,这个地方针对 new对象这部分 的,这个纯自己理解,老师没指明,说的就是再java类加载时,我们理解对象的问题,在这个时候,类文件,构造器,成员变量,成员方法都是对象,这时,就会有方法处理他们,相当于在加载类的时候,类已经被放在手术台上了,要被我们一件一件脱衣给,解剖了。手术工具就在 java.lang.reflect包中。只要类一加载这个就是我们的世界了。



脱衣服,首先是类,然后是构造方法,再然后是成员变量,最后是成员方法,对应的类是Clss  Constructor Field  Method


获得class对象的方法有三种  看 就是不new

1. Person p= new  Person();

Class clazz= p.getClass();


2.Class clazz = Person.class;


3.Class clazz= Class.forName("com.xxxx.xxxx.Person");//方法内是带 报名的字符串,当然 这个方法是要处理异常的



一般用第三种方法,因为灵活啊,任何类只要以字符串形式放进去,就等着解剖了 


那么我们或的构造器了,获得构造器对象了,这里说下,以下的构造器 啊,成员方法啊 成员变量啊 ,都是获取 Person类中public 的 ,因为私有的或其他权限的我们不动他们的 ,给类一点隐私。


构造器:


一次性获得全部的:  

Constructor [   ] cons =clazz.getConstructors();  //看好了  这个末尾是有 S的

一次性获的一份   Constructor cons =clazz.getConstructor( Sting.class;int.clss   );//参数 是原来类参数的类型.class做为参数   空参不填啊

构造器对象得到了,那么就要使用构造器对象实例话对象

 Object  obj =cons.newInstace("zhangsan" ,12);//传具体的值,相当于 new Person("zhangsan",12); 空参不填


看上面创建对象是两部,不行 简化下,在public一个空构造方法时,直接,调用clazz.newInstace();


成员变量:


获得成员变量的对象和上面的差不多

Field[  ]    getFields();

Field getField(String  name);  //获取你指定的成员变量  这里的参数是你要获得的变量的名称

Field field =clazz.getField("name");

这个已经获得,成员变量了,那么我们就要修改下,就用到

field.set(obj,"lisi");//将person对象obj中name值改为lisi


成员方法一样

Method[ ]  getMethods();  //这个方法不仅可以获得本类的公共方法还可以获得父类的方法

Method getMethod(”eat“,Fan.class,Mantou.class)  //这个第一个是找方法的名称 ,第二个是参数形式 当然以.class形式表现

要调用方法就要用到


Method中额invoke 方法

Method method =clazz.getMethod(”eat“,Fan.class,Mantou.class);

Object o= method.invoke(obj,fan, mantou);// 第一个参数是要掉的对象 ,第二参数是多参的实例话对象







你可能感兴趣的:(新手 java 的反射)