java反射机制总结

java反射机制总结

ID:35294592

大小:139.50 KB

页数:12页

时间:2019-03-23

上传者:U-25932
java反射机制总结_第1页
java反射机制总结_第2页
java反射机制总结_第3页
java反射机制总结_第4页
java反射机制总结_第5页
资源描述:

《java反射机制总结》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

运用反射获取一个类的方法信息:获取类的方法(4种)etc.//以下是获取类的方法//1.getClass()方法//Stringstr="abc";//Classclass=str.getClass();System.out.println("第一种获取类的方法:");Integeri=newInteger(3);ClassiClass=i.getClass();//java.lang.Class//System.out.println("CanonicalName:"+iClass.getCanonicalName());//符合规格的System.out.println("SimpleName:"+iClass.getSimpleName());//System.out.println("Name:"+iClass.getName());Stringstr="abc";System.out.println(str.getClass().getSimpleName());//2.Class.forName()System.out.println("第二种获取类的方法:");Classc21=Class.forName("java.lang.String");Classc22=Class.forName("ReflectionDemos.MyClass");Classc23=Class.forName("OperateFile.CopyFile1");System.out.println(c21.getSimpleName());System.out.println(c22.getSimpleName());System.out.println(c23.getSimpleName());//3.Classc=String.class;System.out.println("第三种获取类的方法:");ClassiClass2=int.class;System.out.println(iClass2.getSimpleName());////4.运用原始包装类中的TYPE方法//Classc1=Integer.TYPE;//Classc2=Boolean.TYPE;//Classc3=Void.TYPE; //Classc4=Character.TYPE;System.out.println("第四种获取类的方法:");ClassiClass3=Integer.TYPE;System.out.println(iClass3.getCanonicalName());System.out.println(iClass3.getSimpleName());Output:第一种获取类的方法:SimpleName:IntegerString第二种获取类的方法:StringMyClassCopyFile1第三种获取类的方法:int第四种获取类的方法:intint//显示一个对象的类名/**@method1显示对象的类名*/publicstaticvoidprintClassName(Objectobj){System.out.println("Theclassof"+obj.getClass().getName());}etc./**@testmethod1*/ClassTestct=newClassTest();printClassName(ct);Output:TheclassofReflectionDemos.ClassTest 获得类的所有属性:(包括publicprivateprotected)etc./**@method2ClassField[]getDeclaredFields()返回Field*对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段。*/importjava.lang.reflect.Field;Field[]fields=Class.forName("ReflectionDemos.MyClass").getDeclaredFields();for(inti=0;iMethod[]getDeclaredMethods()返回Method*对象的一个数组,这些对象反映此Class*对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。*/Method[]methods=Class.forName("ReflectionDemos.MyClass").getDeclaredMethods();for(inti=0;i[]getParameterTypes():按照声明顺序返回Class对象的数组,这些对象描述了此Method对象所表示的方法的形参类型。Etc:/**@method6Class[]getParameterTypes():按照声明顺序返回Class对象的数组,这些对象描述了此*Method对象所表示的方法的形参类型。*/System.out.println("下面测试获取方法形参类型:");System.out.println("方法名为:"+method.getName());//privatestaticvoidsetI(inti,Stringstr) Class[]paramClass=method.getParameterTypes();for(inti=0;igetReturnType()返回一个Class对象,该对象描述了此Method对象所表示的方法的正式返回类型。Etc:/**@method7ClassgetReturnType()返回一个Class对象,该对象描述了此Method*对象所表示的方法的正式返回类型。*/System.out.println("下面测试方法的返回类型:");ClassreturnType=method.getReturnType();System.out.println(returnType.getSimpleName());Output:下面测试方法的返回类型:voidObjectinvoke(Objectobj,Object...args)对带有指定参数的指定对象调用由此Method对象表示的底层方法。 1.方法调用(invoke)及获取指定名称和参数的方法:A.针对只具有默认构造函数的类:/**运用反射机制调一个类的方法*/publicclassInvokeTester{inti;Strings;//publicInvokeTester(inti,Strings){//this.i=i;//this.s=s;//}publicintadd(intparam1,intparam2){returnparam1+param2;}publicStringecho(Stringmsg){return"echo:"+msg;}publicstaticvoidmain(String[]args)throwsException{ClassclassType=InvokeTester.class;//获得该类的一个默认对象(实例),与方法ObjectobjectCopy=classType.getConstructor(new//Class[]{}).newInstance(newObject[]{});//等效ObjectinvokeTester=classType.newInstance();//注意是默认对象,即InvokeTester类只有默认构造函数//ObjectinvokeTester=classType.getConstructor(newClass[]{int.class,String.class});//调用InvokeTester对象的add()方法MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//如果第二个参数为newClass[]{}则表示方法无参数Objectresult=addMethod.invoke(invokeTester,newObject[]{newInteger(100),newInteger(200)}); System.out.println((Integer)result);//调用InvokeTester对象的echo()方法MethodechoMethod=classType.getMethod("echo",newClass[]{String.class});result=echoMethod.invoke(invokeTester,newObject[]{"Hello"});System.out.println((String)result);}}Output:300echo:HelloB.针对具有带参数构造函数的类:Java允许一个类拥有多个构造方法,并且可以在构造对象时传入参数用来初始化对象。比如Employee对象的构造方法需要一个String的参数,用来告诉其id。public class Employee{private Stringid; public Employee(Stringid){this.id=id;}}在利用反射创建Employee对象时,我们必需为其创建Constructor对象,用来反映此 Class 对象所表示的类或接口的指定构造方法。//生成class Classcls=Class.forName(className);//参数类型Class[]types= new Class[]{String.class };//类数值对象Object[]values= new Object[]{ "001" };//找到指定的构造方法Constructorconstructor=cls.getDeclaredConstructor(types);//设置安全检查,访问私有构造函数constructor.setAccessible(true);//创建对象Employeee=(Employee)constructor.newInstance(values);自己的例子:importjava.lang.reflect.Constructor;importjava.lang.reflect.Method;/**运用反射机制调一个类的方法*/publicclassInvokeTester{inti;Strings;publicInvokeTester(inti,Strings){this.i=i;this.s=s;}publicintadd(intparam1,intparam2){returnparam1+param2; }publicStringecho(Stringmsg){return"echo:"+msg;}publicstaticvoidmain(String[]args)throwsException{ClassclassType=InvokeTester.class;//获得该类的一个默认对象(实例),与方法ObjectobjectCopy=classType.getConstructor(new//Class[]{}).newInstance(newObject[]{});//等效//ObjectinvokeTester=classType.newInstance();//注意是默认对象,即InvokeTester类只有默认构造函数//ObjectinvokeTester=classType.getConstructor(newClass[]{int.class,String.class});//构造函数参数类型Class[]types=newClass[]{int.class,String.class};//构造函数参数值Object[]values=newObject[]{12,"abc"};//找到指定的构造方法Constructorconstructor=classType.getDeclaredConstructor(types);//设置安全检查,访问私有构造函数constructor.setAccessible(true);//创建对象InvokeTesterinvokeTester=(InvokeTester)constructor.newInstance(values);//调用InvokeTester对象的add()方法MethodaddMethod=classType.getMethod("add",newClass[]{int.class,int.class});//如果第二个参数为newClass[]{}则表示方法无参数Objectresult=addMethod.invoke(invokeTester,newObject[]{newInteger(100),newInteger(200)});System.out.println((Integer)result);//调用InvokeTester对象的echo()方法MethodechoMethod=classType.getMethod("echo",newClass[]{String.class});result=echoMethod.invoke(invokeTester,newObject[]{"Hello" });System.out.println((String)result);}}Output:300echo:Hello1.在生成对象后直接访问属性:import java.lang.reflect.Field;public class TestField{ public Stringtest;public static void main(String[]args){ try {        Classcls=Class.forName("TestField");Fieldf=cls.getField("test");TestFieldtf= (TestField)cls.newInstance(); f.set(tf, "abc");System.out.println(tf.test);} catch (Exceptionex){System.out.println(ex);  }}}2.获取Field值: a.创建一个Class对象b.通过getField创建一个Field对象c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例).b.Etc.importjava.lang.reflect.*;importjava.awt.*;classSampleGet{publicstaticvoidmain(String[]args){Rectangler=newRectangle(100,325);printHeight(r);}staticvoidprintHeight(Rectangler){FieldheightField;IntegerheightValue;Classc=r.getClass();try{heightField=c.getField("height");heightValue=(Integer)heightField.get(r);System.out.println("Height:"+heightValue.toString());}catch(NoSuchFieldExceptione){System.out.println(e);}catch(SecurityExceptione){System.out.println(e);}catch(IllegalAccessExceptione){System.out.println(e);}}}AdditionalResource:Tcast(Objectobj) 将一个对象强制转换成此Class对象所表示的类或接口。Class[]getClasses()返回一个包含某些Class对象的数组,这些对象表示属于此Class对象所表示的类的成员的所有公共类和接口。booleanisPrimitive()判定指定的Class对象是否表示一个基本类型。/**@method5ClassbooleanisPrimitive()判定指定的Class对象是否表示一个基本类型。*/System.out.println(Integer.class.isPrimitive());

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭