以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习去了,没想到收获真的不小,其实我们平时用的跟多操作都是通过反射来完成的,比如对于servlet在web.xml的配置都是同过反射来新建一个对象,还有SSH都是通过反射来实例化对象的,通过了反射让我更好的理解SSH框架。下面小弟就开始小谈一下反射的详细内容吧, 由于本人水平有限,若文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!希望能互相学习。
反射其实就是通过Class对象获取类型的相关信息;
与反射相关的类
1: Class:表示类;
2: Field:表示成员变量;
3: Method:表示方法;
4: Constructor:表示构造器
1:class类:获取class类的话有三种方法
如定义一个Users类
public class Users { private Integer Id; private String Name; private Date Birth; private float Score; public Integer getId() { return Id; } @Override public String toString() { return "Users [Id=" + Id + ", Name=" + Name + ", Birth=" + Birth + ", Score=" + Score + "]"; } public Users() { } public Users(int id) { this.Id = id; } public void setId(Integer id) { Id = id; } public String ResultStr() { return "str"; } public String getName() { return Name; } public void setName(String name) { Name = name; } public Date getBirth() { return Birth; } public void setBirth(Date birth) { Birth = birth; } public float getScore() { return Score; } public void setScore(float score) { Score = score; } }
那么可以通过三种方式来获取该类
Usersp = new Users(); // 获取类的三种方法 Class c2 = p.getClass();//新建一个对象是再获取该类 Class c1 = Users.class;//直接通过类的静态方法来获取该类 Class c3 = Class.forName("com.lishun.Peason");//通过包名和类名来获取该类(配置文件就是通过这种方式来获取实例)
获取到了类就可以获取该类的构造器,方法和成员了(这里就使用上面的第三种方法获取类实例)
1:获取构造器:Constructor
Class c3 = Class.forName("com.lishun.Peason");// //获取本类和父类一个公有构造器 Constructor cPublic=c3.getConstructor(int.class);//int.class指的的含有一个int类型参数的构造器 //获取本类和父类所有公有构造器 Constructor[] cPublicAll=c3.getConstructors(); //获取本类一个私有或公有构造器 Constructor cPublicOrPrivaet=c3.getDeclaredConstructor(); //获取本类所有公有或私有的构造器 Constructor[] cPublicOrPrivaetAll=c3.getDeclaredConstructors(); //执行构造方法 Peason p=(Peason)cPublic.newInstance(1);
2:获取方法:Method
//获取本类和父类单个公有的方法 Method m=c3.getMethod("ResultStr"); //获取本类和父类所有的公有的方法 Method[] mall=c3.getMethods(); //获取本类单个公有或私有的方法(所有访问级别都可获取到) Method m1=c3.getDeclaredMethod("ResultStr1",String.class); //获取本类所有的公有或私有的方法(所有访问级别都可获取到) Method[] mall1=c3.getDeclaredMethods(); //执行该方法 m.invoke(c3.newInstance());//若执行静态的方法,第一个参数为null 无需新的对象
3:成员:Field
//获取本类和父类单个公有的方法 try { Field f = c3.getField("Name"); } catch (Exception e) { System.out.println(e.getMessage()); } //获取本类和父类所有的公有的方法 Field[] fall=c3.getFields(); //获取本类单个公有或私有的成员(所有访问级别) Field f1=c3.getDeclaredField(Name"); //获取本类所有的公有或私有的方法(所有访问级别) Field[] fall1=c3.getDeclaredFields(); Object o=c3.newInstance(); //给成员赋值,private成员,方法,构造器 默认都是不能赋值的 f1.setAccessible(true);//把private的成员设置为可用 f1.set(o, "lishun"); System.out.println(o);
好了我所理解的反射就这些了,,小弟在此若还有没提全的或有错误的,望各位大神们指正出来,我也是个在学习中的小菜鸟,,希望能学得到更多的技术知识