目录
1.获取field2.反编译field3.通过反射机制访问对象属性4.可变长度参数5.反射method(了解)6.反编译(了解)7.反射机制调用方法8.反射constructor9.反射机制调用构造方法10.获取父类和父接口在前面一节我们介绍了反射机制的详细内容反射机制,本节我们将介绍通过反射获取类的属性、方法等信息。
1.获取field
public class reflecttest03 { public static void main(string[] args) throws exception{ //1.获取整个类 class studentclass=class.forname(cn.yujie.bean.student); string classname=studentclass.getname(); system.out.println(classname); system.out.println(studentclass.getsimplename()); //获取类中的所有public的field field[] fields=studentclass.getfields(); system.out.println(fields.length); //测试数组中只有1个元素 //测试这个field field f=fields[0]; //取出field的它的名字 string fieldname=f.getname(); system.out.println(fieldname); //获取所有的field //获取所有的field field[] fs=studentclass.getdeclaredfields(); system.out.println(fs.length); system.out.println(-----------------); //遍历 for(field field :fs){ //获取属性的修饰符列表 //返回的修饰符是一个数字,每个数字是修饰符的代号 int i=field.getmodifiers(); //可以将这个代号数字转换成字符串 string modifierstring = modifier.tostring(i); system.out.print(modifierstring+ ); //获取属性的类型 class fieldtype=field.gettype(); string fname=fieldtype.getsimplename(); system.out.print(fname+ ); //获取属性的名字 system.out.println(field.getname()+ ); system.out.println(); } }}
2.反编译field
通过反射机制,反编译一个类的属性field
public class reflecttest05 { public static void main(string[] args) throws exception{ //创建这个是为了拼接字符串 stringbuilder s=new stringbuilder(); class studentclass=class.forname(cn.yujie.bean.student); s.append(modifier.tostring(studentclass.getmodifiers())+ class +studentclass.getsimplename()+{); field[] fields=studentclass.getdeclaredfields(); s.append(;\n); for(field field:fields){ s.append(\t); s.append(modifier.tostring(field.getmodifiers())); s.append( ); s.append(field.gettype().getsimplename()); s.append( ); s.append(field.getname()); s.append(;\n); } s.append(}); system.out.println(s); }}
3.通过反射机制访问对象属性
必须掌握:
怎么通过反射机制访问一个对象的属性
给属性赋值set
获取属性的值get
public class reflecttest07 { public static void main(string[] args) throws exception{ class studentclass=class.forname(cn.yujie.bean.student); //使用反射机制,怎么取访问一个对象的属性 object obj=studentclass.newinstance(); //obj就是student对象(底层调用无参数构造方法) //获取no属性(根据属性的名称获取field) field nofiled=studentclass.getdeclaredfield(no); //给obj对象(student对象)的no属性赋值 //s.no=111; //给s对象的no属性赋值111,三要素,对象,属性和值 //虽然使用了反射机制,但是三要素还是缺一不可 //注意,反射机制让代码复杂了,但是为了一个灵活,这也是值得的。 nofiled.set(obj,222); //给obj对象的no属性赋值222 //读取属性的值 //两个要素:获取obj对象no属性的值 system.out.println(nofiled.get(obj)); //可以访问私有属性吗 field namefield=studentclass.getdeclaredfield(name); //打破封装(反射机制的缺点:打破封装,可能会给不法分子留下机会) namefield.setaccessible(true); //给name属性赋值 namefield.set(obj,jackson); //获取name属性的值 system.out.println(namefield.get(obj)); }}
4.可变长度参数
可变长度参数
int… args这就是可变长度参数
语法是:类型…(注意:一定是3个点)
1.可变长度参数要求的参数个数是0-n个2.可变长度参数在参数列表中必须在最后一个位置上,而且可变长度参数必须只有一个3.可变长度可以看成一个数组public class argumentstest { public static void main(string[] args) { m(); m(10); m(20,40); //m(abc);编译错误 m3(ab,cd,def,de9); string [] strs={a,b,c}; m3(strs); } public static void m(int... args){ } //必须在最后一个,且只有1个// public static void m2(string... args1,int...args2){//// } public static void m3(string ...args){ //可以将可变长度参数当成一个数组来看 for(int i=0;i<args.length;i++){ system.out.println(args[i]); } }}
5.反射method(了解)
public class reflecttest08 { public static void main(string[] args) throws exception{ //获取类了 class userserviceclass = class.forname("cn.yujie.service.userservice"); //获取所有的method(包括私有的) method[] methods=userserviceclass.getdeclaredmethods(); system.out.println(methods.length); //2 //遍历method for(method method:methods){ //获取修饰符列表 system.out.println(modifier.tostring(method.getmodifiers())); //获取方法的返回值类型 system.out.println(method.getreturntype().getsimplename()); //获取方法名 system.out.println(method.getname()); //方法的参数列表(一个方法的参数可能有多个) class[] parametertypes=method.getparametertypes(); for(class parametertype:parametertypes){ system.out.println(parametertype.getsimplename()); } } }}
6.反编译(了解)
public class reflecttest09 { public static void main(string[] args) throws exception{ stringbuilder s=new stringbuilder(); class userserviceclass = class.forname("cn.yujie.service.userservice"); s.append("public class userservice{ "); s.append(modifier.tostring(userserviceclass.getmodifiers())+"class "+userserviceclass.getsimplename()+"{ "+"\n"); method[] methods=userserviceclass.getdeclaredmethods(); for(method method:methods){ s.append("\t"); s.append(modifier.tostring(method.getmodifiers())); s.append(" "); s.append(method.getreturntype().getsimplename()); s.append(" "); s.append(method.getname()); s.append("("); //参数列表 class[] parametertypes = method.getparametertypes(); for(class parametertype:parametertypes){ s.append(parametertype.getsimplename()); s.append(","); } s.append("){}\n"); } //删除指定下标位置上的字符 s.deletecharat(s.length()-1); s.append("}"); system.out.println(s); }}
7.反射机制调用方法
重点:必须掌握,通过反射机制怎么调用一个方法。反射机制让代码更具有通用性,将来修改配置文件后,创建的对象不一样了,调用的方法也不同了,但是java代码不需要做任何改动,这就是反射的魅力。
public class reflecttest10 { public static void main(string[] args) throws exception{ //通过反射机制调用方法 class userserviceclass = class.forname("cn.yujie.service.userservice"); //创建对象 object obj=userserviceclass.newinstance(); //java中有重载,java中通过方法名和形参来区分方法 method loginmethod=userserviceclass.getdeclaredmethod("login",string.class,string.class); //调用方法 //调用方法有几个要素 //要素1:对象,要素2:方法名,要素3:参数列表,要素4:返回值 //反射机制中最重要的一个方法:必须记住 //四要素 /* loginmethod方法,obj对象 admin,123是参数列表,retvalue是返回值 * */ object retvalue=loginmethod.invoke(obj,"admin","123"); }}
8.反射constructor
public class reflecttest11 { public static void main(string[] args) throws exception{ stringbuilder s=new stringbuilder(); class vipclass=class.forname("cn.yujie.bean.vip"); s.append(modifier.tostring(vipclass.getmodifiers())); s.append(" class "); s.append(vipclass.getsimplename()); s.append("{\n"); //拼接构造方法 constructor[] constructors=vipclass.getdeclaredconstructors(); for(constructor constructor:constructors){ s.append("\t"); s.append(modifier.tostring(constructor.getmodifiers())); s.append(" "); s.append(vipclass.getsimplename()); s.append("("); class[] parametertypes=constructor.getparametertypes(); for(class parametertype:parametertypes){ s.append(parametertype.getsimplename()); s.append(","); } if(parametertypes.length>0) { s.deletecharat(s.length() - 1); } s.append(){}\n); } s.append(}); system.out.println(s); }}
9.反射机制调用构造方法
public class reflecttest12 { public static void main(string[] args) throws exception{ //使用反射机制怎么创建对象 class vipclass=class.forname(cn.yujie.bean.vip); //调用无参构造方法 object obj= vipclass.newinstance(); //调用有参数构造方法 //第一步:先获取到有参数构造方法 constructor con=vipclass.getdeclaredconstructor(int.class,string.class,string.class,boolean.class); //第二步:调用构造方法new对象 object newobj=con.newinstance(110,jackson,1999-10-11,true); system.out.println(newobj); }}
10.获取父类和父接口
public class reflecttest13 { public static void main(string[] args) throws exception { //string举例 class stringclass=class.forname(java.lang.string); //获取string的父类 class superclass=stringclass.getsuperclass(); system.out.println(superclass.getsimplename()); //获取string类实现的所有接口 class[] interfaces=stringclass.getinterfaces(); for(class in:interfaces){ system.out.println(in.getname()); } }}
相关免费学习推荐:java基础
以上就是java介绍通过反射获取类的信息的详细内容。
