欢迎来到天天文库
浏览记录
ID:35294592
大小:139.50 KB
页数:12页
时间:2019-03-23
《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./**@method2Class>Field[]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:/**@method7Class>getReturnType()返回一个Class对象,该对象描述了此Method*对象所表示的方法的正式返回类型。*/System.out.println("下面测试方法的返回类型:");Class>returnType=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{Class>classType=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{Class>classType=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对象是否表示一个基本类型。/**@method5Class>booleanisPrimitive()判定指定的Class对象是否表示一个基本类型。*/System.out.println(Integer.class.isPrimitive());
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处