反射与注解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

反射与注解什么是反射•反射是java程序开发语言的特征之一,它允许运行中的java程序对自身进行检查,并能直接操作程序的内部属性。例如,使用它能获得java类中各成员的名称并显示出来.•Java的这一能力在实际中应用得很多,在其它的程序设计语言中根本不存在这一特性。问题:一个类中有几个部分?六个部分:包,import,类,属性,方法,构造方法,反射的第一个案例helloword•packagebean;•importjava.lang.reflect.Method;•publicclasstest{•privatevoidshow(){}•publicvoidshowe(){}•publicstaticvoidmain(String[]args){•try{•Classc=Class.forName(bean.test);•Methodms[]=c.getDeclaredMethods();•for(Methodm:ms){•System.out.println(m.getModifiers()+\t+m.getName());•}•}catch(SecurityExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(ClassNotFoundExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}•}•}案例:模拟instanceof操作符•什么是instanceof操作符:•publicclassTest2{•publicstaticvoidmain(String[]args){•Objectt=newTest2();•if(tinstanceofTest2){•System.out.println(t是Test2类的一个实例);•}else{•System.out.println(t不是Test2类的一个实例);•}••Objects=newString();•if(sinstanceofTest2){•System.out.println(s是Test2的一个实例);•}else{•System.out.println(s不是Test2的一个实例);•}•}•}•采用反射来判断•try{•Classcls=Class.forName(bean.Test2);•//判断cls是不是一个Integer类的实例•booleanb1=cls.isInstance(newInteger(37));•System.out.println(b1);•booleanb2=cls.isInstance(newTest2());•System.out.println(b2);•}catch(ClassNotFoundExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}获取类的方法•找出一个类中定义了哪些方法及详细信息?获取构造方法获取类的属性创建新对象的实例-带参构造方法•packagebean;•importjava.lang.reflect.Constructor;•importjava.lang.reflect.InvocationTargetException;•publicclassTest3{•publicTest3(){}•publicTest3(inta,intb){•System.out.println(a+\t+b);•}•/**•*@paramargs•*/•publicstaticvoidmain(String[]args){•try{•Classcls=Class.forName(bean.Test3);•//两个参数的类型•Classtypes[]=newClass[2];•types[0]=Integer.TYPE;•types[1]=Integer.TYPE;•//获取带两个参数的构造方法•Constructorct=cls.getConstructor(types);•//参数列表•Objectarglist[]=newObject[2];•arglist[0]=newInteger(2);•arglist[1]=newInteger(30);•Objectretobj=ct.newInstance(arglist);•}catch(SecurityExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalArgumentExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(ClassNotFoundExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(NoSuchMethodExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(InstantiationExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalAccessExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(InvocationTargetExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}•}•}执行带多个参数的方法•packagebean;•importjava.lang.reflect.InvocationTargetException;•importjava.lang.reflect.Method;•publicclassTest4{•publicintadd(inta,intb){•returna+b;•}•publicstaticvoidmain(String[]args){•try{•Classcls=Class.forName(bean.Test4);•Class[]types=newClass[2];•types[0]=Integer.TYPE;•types[1]=Integer.TYPE;•//查找add方法•Methodmethod=cls.getMethod(add,types);•//创建对象实例•Objectobj=cls.newInstance();•//然后调用它的方法•//先参数值j=method•Objectarglist[]=newObject[2];•arglist[0]=newInteger(37);•arglist[1]=newInteger(40);•Objectretob=method.invoke(obj,arglist);•Integerretval=(Integer)retob;•System.out.println(retval);•}catch(SecurityExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalArgumentExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(ClassNotFoundExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(NoSuchMethodExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(InstantiationExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalAccessExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(InvocationTargetExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}•}•}修改属性的值•packagebean;•importjava.lang.reflect.Field;•publicclassTest5{•privatedoubled;•publicstaticvoidmain(String[]args){•try{•Classcls=Class.forName(bean.Test5);•//取属性对象•Fieldfld=cls.getDeclaredField(d);•//新建一个实例•Objectobj=cls.newInstance();•//未设置值之前•System.out.println(d=+((Test5)obj).d);•//调用实例的set方法设置属性值•fld.setDouble(obj,12.34);•System.out.println(d=+((Test5)obj).d);•}catch(SecurityExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalArgumentExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(ClassNotFoundExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(NoSuchFieldExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(InstantiationExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(IllegalAccessExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}•}•}操作数组•packagebean;•importjava.lang.reflect.Array;•publicclassTest6{•publicstaticvoidmain(String[]args){•try{•Classcls=Class.forName(java.lang.String);•Objectarr=Array.newInstance(cls,10);//新建一个长度为10的数组实例•Array.set(arr,5,helloworld);//在数组的第6个位置设置值•//取出数组中第6个位置的值•Strings=(String)Array.get(arr,5);•System.out.println(第6个位置的值为:+s);•}catch(ArrayIndexOutOfBoundsExceptione){•//TODOAuto-generatedcatchblock•e.printStackTrace();•}catch(NegativeA

1 / 23
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功