反射面试题详解_第1页
反射面试题详解_第2页
反射面试题详解_第3页
反射面试题详解_第4页
反射面试题详解_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论