版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、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)获得对
2、象的类型:getName():获得类的完整名字。getFields():获得类的public类型的属性。getDeclaredFields():获得类的所有属性。getMethods():获得类的public类型的方法。getDeclaredMethods():获得类的所有方法。getMethod(String name, Class parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。getConstrutors():获得类的public类型的构造方法。getConstrutor(Class parameterTy
3、pes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。newInstance():通过类的不带参数的构造方法创建这个类的一个对象。(2)通过默认构造方法创建一个新的对象:Object objectCopy=classType.getConstructor(new Class).newInstance(new Object);(3)获得对象的所有属性:Field fields=classType.getDeclaredFields(); Class类的getDeclaredFields()方法返回类的所有属性,包括public、protected、默认
4、和private访问级别的属性。以上代码先调用Class类的getConstructor()方法获得一个Constructor对象,它代表默认的构造方法,然后调用Constructor对象的newInstance()方法构造一个实例。(4)获得每个属性相应的getXXX()和setXXX()方法,然后执行这些方法,把原来对象的属性复制到新的对象中:推荐阅读:java view plaincopyprint?1. Field field=fieldsi; 2. String fieldName=field.getName();
5、160;3. String firstLetter=fieldName.substring(0,1).toUpperCase(); 4. /获得和属性对应的getXXX()方法的名字 String getMethodName="get"+firstLetter+fieldName.substring(1); 5. /获得和属性对应的setXXX()方法的名字 String setMethodName="set&
6、quot;+firstLetter+fieldName.substring(1); 6. /获得和属性对应的getXXX()方法 7. Method getMethod=classType.getMethod(getMethodName,new Class); 8. /获得和属性对应的setXXX()方法 9. Method setMethod=classType.getMethod(setMethodName,new
7、60;Classfield.getType(); 10. /调用原对象的getXXX()方法 11. Object value=getMethod.invoke(object,new Object); 12. System.out.println(fieldName+":"+value); 13. /调用复制对象的setXXX()方法 14. setMethod.invoke(obj
8、ectCopy,new Objectvalue); 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=&quo
9、t;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); Syst
10、em.out.println(fieldName+":"+value); /调用复制对象的setXXX()方法 setMethod.invoke(objectCopy,new Objectvalue);.Method类的invoke(Object obj,Object args)方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回。 .Array类java.lang.Array类提供了
11、动态创建和访问数组元素的各种静态方法。如例程10-4所示的ArrayTester1类的main()方法创建了一个长度为10的字符串数组,接着把索引位置为5的元素设为“hello”,然后再读取索引位置为5的元素的值。java view plaincopyprint?1. import java.lang.reflect.*; 2. public class ArrayTester1 3. public static void main(String
12、;args)throws Exception 4. Class classType = Class.forName("java.lang.String"); 5. /创建一个长度为10的字符串数组 6. Object array = Array.newInstance(classType,
13、0;10); 7. /把索引位置为5的元素设为"hello" 8. Array.set(array, 5, "hello"); 9. /读取索引位置为5的元素的值 10. String s = (String) Array.get(arra
14、y, 5); 11. System.out.println(s); 12. 13. java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。下面开始正文。【案例1】通过一个对象获得完整的包名和类名java view plaincopyprint?1. package Reflect;
15、;2. 3. /* 4. * 通过一个对象获得完整的包名和类名 5. * */ 6. class Demo 7. /other codes. 8. 9. 10. class hello 11. public sta
16、tic void main(String args) 12. Demo demo=new Demo(); 13. System.out.println(demo.getClass().getName(); 14.
17、60;15. 好看的小说:package 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. pac
18、kage Reflect; 2. class Demo 3. /other codes. 4. 5. 6. class hello 7. public static void main(String args) 8.
19、; Class<?> demo1=null; 9. Class<?> demo2=null; 10. Class<?> demo3=null; 11.
20、60; try 12. /一般尽量采用这种形式 13. demo1=Class.forName("Reflect.Demo"); 14.
21、160; catch(Exception e) 15. e.printStackTrace(); 16. 17. demo2=new Demo
22、().getClass(); 18. demo3=Demo.class; 19. 20. System.out.println("类名称 "+demo1.getName();
23、160; 21. System.out.println("类名称 "+demo2.getName(); 22. System.out.println("类名称 "+demo3.getName(); 23.
24、160; 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
25、.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(); 【运行结果】:类名称
26、160; Reflect.Demo类名称 Reflect.Demo类名称 Reflect.Demo【案例3】通过Class实例化其他类的对象通过无参构造实例化对象java view plaincopyprint?1. package Reflect; 2. 3. class Person 4. 5. public
27、60;String getName() 6. return name; 7. 8. public void setName(String name) 9.
28、160; = name; 10. 11. public int getAge() 12. return age; 13. 14.
29、 public void setAge(int age) 15. this.age = age; 16. 17. Override 18. public String toStr
30、ing() 19. return ""++" "+this.age+"" 20. 21. private String name; 22.
31、private int age; 23. 24. 25. class hello 26. public static void main(String args) 27. Class<?> demo=null;
32、160;28. try 29. demo=Class.forName("Reflect.Person"); 30. catch (Exception e) &
33、#160;31. e.printStackTrace(); 32. 33. Person per=null; 34.
34、0; try 35. per=(Person)demo.newInstance(); 36. catch (InstantiationException e) 37.
35、 / TODO Auto-generated catch block 38. e.printStackTrace(); 39. catch (IllegalA
36、ccessException e) 40. / TODO Auto-generated catch block 41. e.printStackTrace(); 42.
37、 43. per.setName("Rollen"); 44. per.setAge(20); 45. System.out.println(
38、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()
39、 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=(P
40、erson)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); 【运行结果】:Rollen 20但是注
41、意一下,当我们把Person中的默认的无参构造函数取消的时候,比如自己定义只定义一个有参数的构造函数之后,会出现错误:比如我定义了一个构造函数:java view plaincopyprint?1. public Person(String name, int age) 2. this.age=age; 3.
42、=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.ne
43、wInstance(Class.java:308) atReflect.hello.main(hello.java:39) atReflect.hello.main(hello.java:47)所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数 【案例】通过Class调用其他类中的构造函数(也可以通过这种方式通过Class创建其他类的对象)java view plaincopyprint?1. package Reflect; 2.
44、; 3. import java.lang.reflect.Constructor; 4. 5. class Person 6. 7. public Person() 8. 9. &
45、#160; 推荐阅读:10. public Person(String name) 11. =name; 12. 13. public Person(int age)
46、; 14. this.age=age; 15. 16. public Person(String name, int age) 17. this.age=age;
47、0;18. =name; 19. 20. public String getName() 21. return name; 22.
48、60; 23. public int getAge() 24. return age; 25. 26. Override 27. public
49、160;String toString() 28. return ""++" "+this.age+"" 29. 30. private String name; 31.
50、60; private int age; 32. 33. 34. class hello 35. public static void main(String args) 36. Class<?>
51、60;demo=null; 37. try 38. demo=Class.forName("Reflect.Person"); 39. catch (Exception
52、 e) 40. e.printStackTrace(); 41. 42. Person per1=null; 43.
53、 Person per2=null; 44. Person per3=null; 45. Person per4=null; 46. /取得全部的
54、构造函数 47. Constructor<?> cons=demo.getConstructors(); 48. try 49. per1=(Person)cons0.new
55、Instance(); 50. per2=(Person)cons1.newInstance("Rollen"); 51. per3=(Person)cons2.newInstance(20); 52.
56、; per4=(Person)cons3.newInstance("Rollen",20); 53. catch(Exception e) 54. e.printSta
57、ckTrace(); 55. 56. System.out.println(per1); 57. System.out.println(per2); 58.
58、160; System.out.println(per3); 59. System.out.println(per4); 60. 61. package Reflect; import java.lang.reflect.Constructor; class Person public Person() public Person(Stri
59、ng 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+"" pri
60、vate 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<
61、;?> 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.printl
62、n(per2); System.out.println(per3); System.out.println(per4); 【运行结果】:null 0Rollen 0null 20Rollen 20【案例】 返回一个类实现的接口:java view plaincopyprint?1. package Reflect; 2. 3. interface China 4. public st
63、atic final String name="Rollen" 5. public static int age=20; 6. public void sayChina(); 7. public void sayHello(String name,
64、 int age); 8. 9. 10. class Person implements China 11. public Person() 12. 13.
65、160;14. public Person(String sex) 15. this.sex=sex; 16. 17. public String getSex() 18.
66、0; return sex; 19. 20. public void setSex(String sex) 21. this.sex = sex; 22.
67、0; 23. Override 24. public void sayChina() 25. System.out.println("hello ,china"); 26. 27.
68、160; Override 28. public void sayHello(String name, int age) 29. System.out.println(name+" "+age); 30.
69、;31. private String sex; 32. 33. 34. class hello 35. public static void main(String args) 36. Class&
70、lt;?> demo=null; 37. try 38. demo=Class.forName("Reflect.Person"); 39. catch
71、;(Exception e) 40. e.printStackTrace(); 41. 42. /保存所有的接口 43.
72、160; Class<?> intes=demo.getInterfaces(); 44. for (int i = 0; i < intes.length; i+) 45.
73、; System.out.println("实现的接口 "+intesi.getName(); 46. 47. 48. package Reflect; interface China public static final String name="Rollen
74、" 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()
75、 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 (Exc
76、eption 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的代码)【案例】:取得其他类中的父类
77、java view plaincopyprint?1. class hello 2. public static void main(String args) 3. Class<?> demo=null; 4.
78、;try 5. demo=Class.forName("Reflect.Person"); 6. catch (Exception e) 7. &
79、#160; e.printStackTrace(); 8. 9. /取得父类 10. Class<?> temp=demo.getSuperclass(); 11.
80、 System.out.println("继承的父类为: "+temp.getName(); 12. 13. class hello public static void main(String args) Class<?> demo=null; try demo=Class.forName("Reflect
81、.Person"); catch (Exception e) e.printStackTrace(); /取得父类 Class<?> temp=demo.getSuperclass(); System.out.println("继承的父类为: "+temp.getName(); 【运行结果】【案例】:获得其他类中的全部构造函数这个例子需要在程序开头添加import java.lang.reflect.*;然后将主类编写为:java view plaincopyprint?1. class hello 2. &
82、#160; public static void main(String args) 3. Class<?> demo=null; 4. try 5.
83、; demo=Class.forName("Reflect.Person"); 6. catch (Exception e) 7. e.printStackTrace(); 8.
84、160; 9. Constructor<?>cons=demo.getConstructors(); 10. for (int i = 0; i < cons.length; i+)
85、 11. System.out.println("构造方法: "+consi); 12. 13. 14. class hello public stati
86、c void main(String args) Class<?> demo=null; try demo=Class.forName("Reflect.Person"); catch (Exception e) e.printStackTrace(); Constructor<?>cons=demo.getConstructors(); for (int i = 0; i < cons.length; i+) System.out.println("构造方法: "+consi); 【运行结果】:构造方法: pu
87、blic Reflect.Person()构造方法: public Reflect.Person(java.lang.String)但是细心的读者会发现,上面的构造函数没有public 或者private这一类的修饰符下面这个例子我们就来获取修饰符java view plaincopyprint?1. class hello 2. public static void main(String args) 3.
88、0; Class<?> demo=null; 4. try 5. demo=Class.forName("Reflect.Person"); 6.
89、; catch (Exception e) 7. e.printStackTrace(); 8. 9. C
90、onstructor<?>cons=demo.getConstructors(); 10. for (int i = 0; i < cons.length; i+) 11. Class<?>
91、160;p=consi.getParameterTypes(); 12. System.out.print("构造方法: "); 13. int mo=consi.getModifiers();
92、;14. System.out.print(Modifier.toString(mo)+" "); 15. System.out.print(consi.getName(); 16. System.out.print("("); 17. for(int j=0;j<p.length;+j) 18.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年及未来5年市场数据中国环保地材行业发展监测及投资战略规划研究报告
- 教室里的友谊记事作文6篇范文
- 社区垃圾分类处理协议
- 型员工绩效评价系统流程指南
- 特有植物保护繁育承诺书9篇
- 专业研究合规性承诺书范文4篇
- 营销策划全面解决方案模板
- 热爱自然的孩子写景作文7篇范文
- 跨境电商物流代理合同2025年合作协议
- 2025年农业类半结构化面试题库及答案
- 2026年广东省事业单位集中公开招聘高校毕业生11066名笔试模拟试题及答案解析
- 2025年淮北职业技术学院单招职业适应性测试题库带答案解析
- 安全生产九个一制度
- 司法鉴定资料专属保密协议
- (更新)成人留置导尿护理与并发症处理指南课件
- 丝路基金招聘笔试题库2026
- 巨量引擎《2026巨量引擎营销IP通案》
- 2026届高考化学冲刺复习化学综合实验热点题型
- 电缆接驳施工方案(3篇)
- 唐代皇太子教育制度与储君培养
- 中职生理学考试真题及解析
评论
0/150
提交评论