新手上路,请祝我一路顺风,请多指教
反射,反过来设计,这个地方针对 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);// 第一个参数是要掉的对象 ,第二参数是多参的实例话对象