Java反射机制总结.doc_第1页
Java反射机制总结.doc_第2页
Java反射机制总结.doc_第3页
Java反射机制总结.doc_第4页
Java反射机制总结.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

运用反射获取一个类的方法信息:获取类的方法(4种)etc./ 以下是获取类的方法/ 1.getClass()方法/ String str = abc;/ Class class = str.getClass();System.out.println(第一种获取类的方法:);Integer i = new Integer(3);Class iClass = i.getClass();/java.lang.Class/System.out.println(Canonical Name: + iClass.getCanonicalName();/符合规格的System.out.println(Simple Name: + iClass.getSimpleName();/System.out.println(Name: + iClass.getName();String str = abc;System.out.println(str.getClass().getSimpleName();/ 2.Class.forName()System.out.println(第二种获取类的方法: );Class c21 = Class.forName(java.lang.String);Class c22 = Class.forName(ReflectionDemos.MyClass);Class c23 = Class.forName(OperateFile.CopyFile1);System.out.println(c21.getSimpleName();System.out.println(c22.getSimpleName();System.out.println(c23.getSimpleName();/ 3.Class c = String.class;System.out.println(第三种获取类的方法:);Class iClass2 = int.class;System.out.println(iClass2.getSimpleName();/ 4.运用原始包装类中的TYPE方法/ Class c1 = Integer.TYPE;/ Class c2 = Boolean.TYPE;/ Class c3 = Void.TYPE;/ Class c4 = Character.TYPE;System.out.println(第四种获取类的方法:);Class iClass3 = Integer.TYPE;System.out.println(iClass3.getCanonicalName();System.out.println(iClass3.getSimpleName();Output:第一种获取类的方法:Simple Name: IntegerString第二种获取类的方法: StringMyClassCopyFile1第三种获取类的方法:int第四种获取类的方法:intint/显示一个对象的类名/* method1 显示对象的类名*/public static void printClassName(Object obj) System.out.println(The class of + obj.getClass().getName();etc./* * test method1 */ClassTest ct = new ClassTest();printClassName(ct);Output:The class of ReflectionDemos.ClassTest获得类的所有属性:(包括publicprivateprotected)etc./* * method2 Class Field getDeclaredFields() 返回 Field * 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 */import java.lang.reflect.Field;Field fields = Class.forName(ReflectionDemos.MyClass).getDeclaredFields();for (int i = 0; i fields.length; i+) System.out.println(属性名: + fieldsi.getName() + t属性类型+ fieldsi.getType();Output:属性名:i属性类型int属性名:f属性类型float属性名:s属性类型class java.lang.String属性名:array属性类型class Ljava.lang.Object;/获得类的所有方法Method methods = classType.getDeclaredMethods();methods0.toString();/此方法的描述etc./* * method4 Class Method getDeclaredMethods() 返回 Method * 对象的一个数组,这些对象反映此 Class * 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 */Method methods = Class.forName(ReflectionDemos.MyClass).getDeclaredMethods();for (int i = 0; i methods.length; i+) System.out.println(MyClass类的方法: + methodsi.getName();Output:MyClass类的方法:getIMyClass类的方法:setIMyClass类的方法:getFMyClass类的方法:setFMyClass类的方法:getSMyClass类的方法:setS1. Method类的方法:getModifiers() 返回此Method对象所表示方法的Java语言修饰符getName() 以String形式返回此Method对象表示的方法名称Annotation getParameterAnnotations() 返回表示按照声明顺序对此 Method 对象所表示方法的形参进行注释的那个数组的数组。在Web Service中也有一种运用Java标注的情况。ClassgetParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。Etc:/* * method6 ClassgetParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此 * Method 对象所表示的方法的形参类型。 */System.out.println(下面测试获取方法形参类型: );System.out.println(方法名为: + method.getName();/private static void setI(int i, String str)Class paramClass = method.getParameterTypes();for (int i = 0; i paramClass.length; i+) System.out.println(paramClassi.getSimpleName();Output:下面测试获取方法形参类型: 方法名为:setIintStringClass getReturnType() 返回一个 Class 对象,该对象描述了此 Method 对象所表示的方法的正式返回类型。 Etc:/* * method7 Class getReturnType() 返回一个 Class 对象,该对象描述了此 Method * 对象所表示的方法的正式返回类型。 */System.out.println(下面测试方法的返回类型:);Class returnType = method.getReturnType();System.out.println(returnType.getSimpleName();Output: 下面测试方法的返回类型:void Object invoke(Object obj, Object. args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 2. 方法调用(invoke)及获取指定名称和参数的方法:A 针对只具有默认构造函数的类:/* * 运用反射机制调一个类的方法 */public class InvokeTester int i;String s;/public InvokeTester(int i, String s)/this.i = i;/this.s = s;/public int add(int param1, int param2) return param1 + param2;public String echo(String msg) return echo: + msg;public static void main(String args) throws Exception Class classType = InvokeTester.class;/ 获得该类的一个默认对象(实例),与方法Object objectCopy=classType.getConstructor(new/ Class).newInstance(new Object);/ 等效Object invokeTester = classType.newInstance();/注意是默认对象,即InvokeTester类只有默认构造函数/Object invokeTester = classType.getConstructor(new Class int.class, String.class );/ 调用InvokeTester对象的add()方法Method addMethod = classType.getMethod(add, new Class int.class,int.class );/如果第二个参数为 new Class 则表示方法无参数Object result = addMethod.invoke(invokeTester, new Object new Integer(100), new Integer(200) );System.out.println(Integer) result);/ 调用InvokeTester对象的echo()方法Method echoMethod = classType.getMethod(echo,new Class String.class );result = echoMethod.invoke(invokeTester, new Object Hello );System.out.println(String) result);Output:300echo: HelloB. 针对具有带参数构造函数的类:Java 允许一个类拥有多个构造方法,并且可以在构造对象时传入参数用来初始化对象。比如 Employee 对象的构造方法需要一个 String 的参数,用来告诉其 id 。publicclassEmployee privateString id;publicEmployee(String id) this.id = id;在利用反射创建 Employee 对象时,我们必需为其创建 Constructor 对象,用来反映此Class对象所表示的类或接口的指定构造方法。/ 生成classClass cls = Class.forName(className);/ 参数类型Class types =newClass String.class;/ 类数值对象Object values =newObject 001;/ 找到指定的构造方法Constructor constructor = cls.getDeclaredConstructor(types);/ 设置安全检查,访问私有构造函数constructor.setAccessible(true);/ 创建对象Employee e = (Employee) constructor.newInstance(values);自己的例子:import java.lang.reflect.Constructor;import java.lang.reflect.Method;/* * 运用反射机制调一个类的方法 */public class InvokeTester int i;String s;public InvokeTester(int i, String s)this.i = i;this.s = s;public int add(int param1, int param2) return param1 + param2;public String echo(String msg) return echo: + msg;public static void main(String args) throws Exception Class classType = InvokeTester.class;/ 获得该类的一个默认对象(实例),与方法Object objectCopy=classType.getConstructor(new/ Class).newInstance(new Object);/ 等效/Object invokeTester = classType.newInstance();/注意是默认对象,即InvokeTester类只有默认构造函数/Object invokeTester = classType.getConstructor(new Class int.class, String.class ); / 构造函数参数类型Class types = new Class int.class, String.class;/ 构造函数参数值Object values = new Object 12, abc;/找到指定的构造方法Constructor constructor = classType.getDeclaredConstructor(types);/设置安全检查,访问私有构造函数constructor.setAccessible(true);/创建对象InvokeTester invokeTester = (InvokeTester) constructor.newInstance(values);/ 调用InvokeTester对象的add()方法Method addMethod = classType.getMethod(add, new Class int.class,int.class );/如果第二个参数为 new Class 则表示方法无参数Object result = addMethod.invoke(invokeTester, new Object new Integer(100), new Integer(200) );System.out.println(Integer) result);/ 调用InvokeTester对象的echo()方法Method echoMethod = classType.getMethod(echo,new Class String.class );result = echoMethod.invoke(invokeTester, new Object Hello );System.out.println(String) result);Output:300echo: Hello3. 在生成对象后直接访问属性:importjava.lang.reflect.Field;publicclassTestField publicString test;publicstaticvoidmain(String args) tryClass cls = Class.forName(TestField); Field f = cls.getField(test);TestField tf =(TestField)cls.newInstance();f.set(tf,abc);System.out.println(tf.test);catch(Exception ex) System.out.println(ex);4. 获取Field值:a. 创建一个Class对象b.通过getField 创建一个Field对象c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例).b. Etc.import java.lang.reflect.*;import java.awt.*;class SampleGet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论