已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java 反射常用方法(面试常见) 在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:1.Class类:代表一个类。2.Field类:代表类的成员变量(成员变量也称为类的属性)。3.Method类:代表类的方法。4.Constructor类:代表类的构造方法。5.Array类:提供了动态创建数组,以及访问数组元素的静态方法。.Class类在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API中的核心类,它有以下方法(1)获得对象的类型:getName():获得类的完整名字。getFields():获得类的public类型的属性。getDeclaredFields():获得类的所有属性。getMethods():获得类的public类型的方法。getDeclaredMethods():获得类的所有方法。getMethod(String name, Class parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。getConstrutors():获得类的public类型的构造方法。getConstrutor(Class parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。newInstance():通过类的不带参数的构造方法创建这个类的一个对象。(2)通过默认构造方法创建一个新的对象:Object objectCopy=classType.getConstructor(new Class).newInstance(new Object);(3)获得对象的所有属性:Field fields=classType.getDeclaredFields();Class类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认和private访问级别的属性。以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。(4)获得每个属性相应的getXXX()和setXXX()方法,然后执行这些方法,把原来对象的属性复制到新的对象中:推荐阅读:/java view plaincopyprint?1. Fieldfield=fieldsi;2. StringfieldName=field.getName();3. StringfirstLetter=fieldName.substring(0,1).toUpperCase();4. /获得和属性对应的getXXX()方法的名字StringgetMethodName=get+firstLetter+fieldName.substring(1); 5. /获得和属性对应的setXXX()方法的名字StringsetMethodName=set+firstLetter+fieldName.substring(1); 6. /获得和属性对应的getXXX()方法 7. MethodgetMethod=classType.getMethod(getMethodName,newClass);8. /获得和属性对应的setXXX()方法 9. MethodsetMethod=classType.getMethod(setMethodName,newClassfield.getType();10. /调用原对象的getXXX()方法 11. Objectvalue=getMethod.invoke(object,newObject);12. System.out.println(fieldName+:+value);13. /调用复制对象的setXXX()方法 14. setMethod.invoke(objectCopy,newObjectvalue);Field field=fieldsi; String fieldName=field.getName(); String firstLetter=fieldName.substring(0,1).toUpperCase(); /获得和属性对应的getXXX()方法的名字 String getMethodName=get+firstLetter+fieldName.substring(1); /获得和属性对应的setXXX()方法的名字 String setMethodName=set+firstLetter+fieldName.substring(1); /获得和属性对应的getXXX()方法 Method getMethod=classType.getMethod(getMethodName,new Class); /获得和属性对应的setXXX()方法 Method setMethod=classType.getMethod(setMethodName,new Classfield.getType(); /调用原对象的getXXX()方法 Object value=getMethod.invoke(object,new Object); System.out.println(fieldName+:+value); /调用复制对象的setXXX()方法 setMethod.invoke(objectCopy,new Objectvalue);.Method类的invoke(Object obj,Object args)方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。.Array类java.lang.Array类提供了动态创建和访问数组元素的各种静态方法。如例程10-4所示的ArrayTester1类的main()方法创建了一个长度为10的字符串数组,接着把索引位置为5的元素设为“hello”,然后再读取索引位置为5的元素的值。java view plaincopyprint?1. importjava.lang.reflect.*;2. publicclassArrayTester13. publicstaticvoidmain(Stringargs)throwsException4. ClassclassType=Class.forName(java.lang.String);5. /创建一个长度为10的字符串数组 6. Objectarray=Array.newInstance(classType,10);7. /把索引位置为5的元素设为hello 8. Array.set(array,5,hello);9. /读取索引位置为5的元素的值 10. Strings=(String)Array.get(array,5);11. System.out.println(s);12. 13. java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。下面开始正文。【案例1】通过一个对象获得完整的包名和类名java view plaincopyprint?1. packageReflect;2. 3. /*4. *通过一个对象获得完整的包名和类名5. */6. classDemo7. /othercodes. 8. 9. 10. classhello11. publicstaticvoidmain(Stringargs)12. Demodemo=newDemo();13. System.out.println(demo.getClass().getName();14. 15. 好看的小说:/modules/article/toplist.php?sort=allvisitpackage Reflect; /* * 通过一个对象获得完整的包名和类名 * */class Demo /other codes. class hello public static void main(String args) Demo demo=new Demo(); System.out.println(demo.getClass().getName(); 【运行结果】:Reflect.Demo添加一句:所有类的对象其实都是Class的实例。【案例2】实例化Class类对象java view plaincopyprint?1. packageReflect;2. classDemo3. /othercodes. 4. 5. 6. classhello7. publicstaticvoidmain(Stringargs)8. Classdemo1=null;9. Classdemo2=null;10. Classdemo3=null;11. try12. /一般尽量采用这种形式 13. demo1=Class.forName(Reflect.Demo);14. catch(Exceptione)15. e.printStackTrace();16. 17. demo2=newDemo().getClass();18. demo3=Demo.class;19. 20. System.out.println(类名称+demo1.getName();21. System.out.println(类名称+demo2.getName();22. System.out.println(类名称+demo3.getName();23. 24. 25. package Reflect;class Demo /other codes. class hello public static void main(String args) Class demo1=null; Class demo2=null; Class demo3=null; try /一般尽量采用这种形式 demo1=Class.forName(Reflect.Demo); catch(Exception e) e.printStackTrace(); demo2=new Demo().getClass(); demo3=Demo.class; System.out.println(类名称 +demo1.getName(); System.out.println(类名称 +demo2.getName(); System.out.println(类名称 +demo3.getName(); 【运行结果】:类名称 Reflect.Demo类名称 Reflect.Demo类名称 Reflect.Demo【案例3】通过Class实例化其他类的对象通过无参构造实例化对象java view plaincopyprint?1. packageReflect;2. 3. classPerson4. 5. publicStringgetName()6. returnname;7. 8. publicvoidsetName(Stringname)9. =name;10. 11. publicintgetAge()12. returnage;13. 14. publicvoidsetAge(intage)15. this.age=age;16. 17. Override18. publicStringtoString()19. return++this.age+;20. 21. privateStringname;22. privateintage;23. 24. 25. classhello26. publicstaticvoidmain(Stringargs)27. Classdemo=null;28. try29. demo=Class.forName(Reflect.Person);30. catch(Exceptione)31. e.printStackTrace();32. 33. Personper=null;34. try35. per=(Person)demo.newInstance();36. catch(InstantiationExceptione)37. /TODOAuto-generatedcatchblock 38. e.printStackTrace();39. catch(IllegalAccessExceptione)40. /TODOAuto-generatedcatchblock 41. e.printStackTrace();42. 43. per.setName(Rollen);44. per.setAge(20);45. System.out.println(per);46. 47. package Reflect; class Person public String getName() return name; public void setName(String name) = name; public int getAge() return age; public void setAge(int age) this.age = age; Override public String toString() return ++ +this.age+; private String name; private int age; class hello public static void main(String args) Class demo=null; try demo=Class.forName(Reflect.Person); catch (Exception e) e.printStackTrace(); Person per=null; try per=(Person)demo.newInstance(); catch (InstantiationException e) / TODO Auto-generated catch block e.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch block e.printStackTrace(); per.setName(Rollen); per.setAge(20); System.out.println(per); 【运行结果】:Rollen20但是注意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后,会出现错误:比如我定义了一个构造函数:java view plaincopyprint?1. publicPerson(Stringname,intage)2. this.age=age;3. =name;4. public Person(String name, int age) this.age=age; =name; 然后继续运行上面的程序,会出现:java.lang.InstantiationException: Reflect.Person atjava.lang.Class.newInstance0(Class.java:340) atjava.lang.Class.newInstance(Class.java:308) atReflect.hello.main(hello.java:39)Exception in thread main java.lang.NullPointerException atReflect.hello.main(hello.java:47)所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数 【案例】通过Class调用其他类中的构造函数(也可以通过这种方式通过Class创建其他类的对象)java view plaincopyprint?1. packageReflect;2. 3. importjava.lang.reflect.Constructor;4. 5. classPerson6. 7. publicPerson()8. 9. 推荐阅读:/10. publicPerson(Stringname)11. =name;12. 13. publicPerson(intage)14. this.age=age;15. 16. publicPerson(Stringname,intage)17. this.age=age;18. =name;19. 20. publicStringgetName()21. returnname;22. 23. publicintgetAge()24. returnage;25. 26. Override27. publicStringtoString()28. return++this.age+;29. 30. privateStringname;31. privateintage;32. 33. 34. classhello35. publicstaticvoidmain(Stringargs)36. Classdemo=null;37. try38. demo=Class.forName(Reflect.Person);39. catch(Exceptione)40. e.printStackTrace();41. 42. Personper1=null;43. Personper2=null;44. Personper3=null;45. Personper4=null;46. /取得全部的构造函数 47. Constructorcons=demo.getConstructors();48. try49. per1=(Person)cons0.newInstance();50. per2=(Person)cons1.newInstance(Rollen);51. per3=(Person)cons2.newInstance(20);52. per4=(Person)cons3.newInstance(Rollen,20);53. catch(Exceptione)54. e.printStackTrace();55. 56. System.out.println(per1);57. System.out.println(per2);58. System.out.println(per3);59. System.out.println(per4);60. 61. package Reflect; import java.lang.reflect.Constructor; class Person public Person() public Person(String name) =name; public Person(int age) this.age=age; public Person(String name, int age) this.age=age; =name; public String getName() return name; public int getAge() return age; Override public String toString() return ++ +this.age+; private String name; private int age; class hello public static void main(String args) Class demo=null; try demo=Class.forName(Reflect.Person); catch (Exception e) e.printStackTrace(); Person per1=null; Person per2=null; Person per3=null; Person per4=null; /取得全部的构造函数 Constructor cons=demo.getConstructors(); try per1=(Person)cons0.newInstance(); per2=(Person)cons1.newInstance(Rollen); per3=(Person)cons2.newInstance(20); per4=(Person)cons3.newInstance(Rollen,20); catch(Exception e) e.printStackTrace(); System.out.println(per1); System.out.println(per2); System.out.println(per3); System.out.println(per4); 【运行结果】:null 0Rollen 0null 20Rollen20【案例】返回一个类实现的接口:java view plaincopyprint?1. packageReflect;2. 3. interfaceChina4. publicstaticfinalStringname=Rollen;5. publicstaticintage=20;6. publicvoidsayChina();7. publicvoidsayHello(Stringname,intage);8. 9. 10. classPersonimplementsChina11. publicPerson()12. 13. 14. publicPerson(Stringsex)15. this.sex=sex;16. 17. publicStringgetSex()18. returnsex;19. 20. publicvoidsetSex(Stringsex)21. this.sex=sex;22. 23. Override24. publicvoidsayChina()25. System.out.println(hello,china);26. 27. Override28. publicvoidsayHello(Stringname,intage)29. System.out.println(name+age);30. 31. privateStringsex;32. 33. 34. classhello35. publicstaticvoidmain(Stringargs)36. Classdemo=null;37. try38. demo=Class.forName(Reflect.Person);39. catch(Exceptione)40. e.printStackTrace();41. 42. /保存所有的接口 43. Classintes=demo.getInterfaces();44. for(inti=0;iintes.length;i+)45. System.out.println(实现的接口+intesi.getName();46. 47. 48. package Reflect; interface China public static final String name=Rollen; public static int age=20; public void sayChina(); public void sayHello(String name, int age); class Person implements China public Person() public Person(String sex) this.sex=sex; public String getSex() return sex; public void setSex(String sex) this.sex = sex; Override public void sayChina() System.out.println(hello ,china); Override public void sayHello(String name, int age) System.out.println(name+ +age); private String sex; class hello public static void main(String args) Class demo=null; try demo=Class.forName(Reflect.Person); catch (Exception e) e.printStackTrace(); /保存所有的接口 Class intes=demo.getInterfaces(); for (int i = 0; i intes.length; i+) System.out.println(实现的接口 +intesi.getName(); 【运行结果】:实现的接口 Reflect.China(注意,以下几个例子,都会用到这个例子的Person类,所以为节省篇幅,此处不再粘贴Person的代码部分,只粘贴主类hello的代码)【案例】:取得其他类中的父类java view plaincopyprint?1. classhello2. publicstaticvoidmain(Stringargs)3. Classdemo=null;4. try5. demo=Class.forName(Reflect.Person);6. catch(Exceptione)7. e.printStackTrace();8. 9. /取得父类 10. Classtemp=demo.getSuperclass();11. System.out.println(继承的父类为:+temp.getName();12. 13. class hello public static void main(String args) Class demo=null; try demo=Class.forName(Reflect.Person); catch (Exception e) e.printStackTrace(); /取得父类 Class temp=demo.getSuperclass(); System.out.println(继承的父类为: +temp.getName(); 【运行结果】继承的父类为: java.lang.Object【案例】:获得其他类中的全部构造函数这个例子需要在程序开头添加import java.lang.reflect.*;然后将主类编写为:java view plaincopyprint?1. classhello2. publicstaticvoidmain(Stringargs)3. Classdemo=null;4. try5. demo=Class.forName(Reflect.Person);6. catch(Exceptione)7. e.printStackTrace();8. 9. Constructorcons=demo.getConstructors();10. for(inti=0;icons.length;i+)11. System.out.println(构造方法:+consi);12. 13. 14. class hello public static void main(String args) Class demo=null; try demo=Class.forName(Reflect.Person); catch (Exception e) e.printStackTrace(); Constructorcons=demo.getConstructors(); for (int i = 0; i cons.length; i+) System.out.println(构造方法: +consi); 【运行结果】:构造方法: public Reflect.Person()构造方法: public Reflect.Person(java.lang.String)但是细心的读者会发现,上面的构造函数没有public 或者private这一类的修饰符下面这个例子我们就来获取修饰符java view plaincopyprint?1. classhello2. publicstaticvoidmain(Stringargs)3. Classdemo=null;4. try5. demo=Class.forName(Reflect.Person);6. catch(Exceptione)7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多联机空调系统技术要点
- 不间断电源系统技术要点
- 施工技术考试题库及答案
- 食品安全培训c类试题及答案
- 砂轮机使用安全培训试题及答案
- 辅警岗位知识培训课件
- 2026 年初中英语《动词》专项练习与答案 (100 题)
- 2026年深圳中考语文传统题型强化试卷(附答案可下载)
- 春晚排序题目及答案
- 2025 小学二年级科学下册了解光的折射现象实例分析报告总结报告课件
- 行为面试法培训课件
- 2.3.2 我国第一大河-长江(课件)2025-2026学年度人教版地理八年级上册
- 征信培训管理办法
- “半城市化”地区的治理视角识别与综合评价体系构建研究
- 宫颈机能不全超声诊断与治疗
- 仓库物品丢失管理办法
- 2024AHA心肺复苏指南
- 甘肃省劳模管理暂行办法
- 护理部主任年终述职报告
- 2025年初中英语课程标准(2022年版)测试卷及答案
- 工艺管线焊后热处理施工技术方案
评论
0/150
提交评论