反射机制及使用说明,符代码.doc_第1页
反射机制及使用说明,符代码.doc_第2页
反射机制及使用说明,符代码.doc_第3页
反射机制及使用说明,符代码.doc_第4页
反射机制及使用说明,符代码.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

反射使用反射经常要用到的类,位于java.lang.reflect包中。-Class类:代表一个类-Field类:代表类的成员变量-Method类:代表类的方法-Constructor类:代表类的构造方法-Array类:提供一个动态创建的数组,以及访问数组元素的静态方法。使用Method类public class RefletTestpublic static void main(String args) throws ExceptionClass classType = Class.forName(java.lang.String);/getDeclaredMethods获得对应类的所有方法,包括private的Method methods = classType.getDeclaredMethods();for(Method method : methods)System.out.println(method);使用反射进行方法的调用public class InvokeTesterpublic int add(int a,int b)return a + b;public void output(String msg)System.out.println(msg);public static void main(String args) throws Exception/取得自定义类的类型Class classType = InvokeTester.class;/创建自定义的一个实例Object invokeTester = classType.newInstance();/取得自定义类的一个方法Method addMethod = classType.getMethod(add, new Classint.class, int.class );/调用自定义类的实例的方法Object result = addMethod.invoke(invokeTester, new Object1, 2);System.out.println(result);Method outputMethod = classType.getMethod(output,new ClassString.class);outputMethod.invoke(invokeTester,new ObjectHello);System.out.println(Object.class);要使用反射,首先需要获得待处理类或对象所对应的Class对象。获取某个类或某个对象对应的Class对象的常用的3种方式:a.使用Class类的静态方法forName.如Class.forName(“java.lang.String”);b.使用类的.class语法:String.classc.使用对象的getClass()方法:Strings = “a”; Class clazz = s.getClass();public class ClassTestpublic static void main(String args)Class classType = Child.class;System.out.println(classType);classType = classType.getSuperclass();System.out.println(classType);classType = classType.getSuperclass();System.out.println(classType);classType = classType.getSuperclass();System.out.println(classType);class Parentclass Child extends ParentConstructor类的使用若想调用类的不带参数的构造方法来生成对象,我们有两种方法:a. 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可。Class clazz = String.class;Object object = clazz.newInstance();b. 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor对象的newInstance方法生成:Class clazz = Customer.class;Constructor cons = clazz.getConstructor(new Class);Object obj = cons.newsInstance(new Object);若想调用类的带参数的构造方法,可以用如下方式:Class clazz = Customer.class;Constructor cons = clazz.getConstructor(new ClassString.class,int.class);Object obj = cons.newsInstance(new Object“jack”,23);public class Customerprivate long Id;private String name;private int age;public Customer()public Customer(String name, int age) = name ;this.age = age;public long getId()return Id;public void setId(long id)Id = id;public String getName()return name;public void setName(String name) = name;public int getAge()return age;public void setAge(int age)this.age = age;public class ConstructorTest/这个方法用于实现对object对象的拷贝操作public Object copy (Object object) throws Exception/*Class classType = object.getClass();/可以用于各种构造函数 Constructor cons = classType.getConstructor(new ClassString.class , int.class);Object obj = cons.newInstance(new ObjectJack, 30);/以上两行相当于下面的一行,但是下面这种用法,只能用于无参的构造函数。/Object obj1 = classType.newInstance();System.out.println(obj);*/Class classType = object.getClass();Object objCopy = classType.getConstructor(new Class).newInstance(new Object);Field fields = classType.getDeclaredFields();for(Field field : fields)String name = field.getName();String firstLetter = name.substring(0,1).toUpperCase();String getMethodName = get + firstLetter + name.substring(1);String setMethodName = set + firstLetter + name.substring(1);Method getMethod = classType.getMethod(getMethodName,new Class);Method setMethod = classType.getMethod(setMethodName,new Classfield.getType();Object value = getMethod.invoke(object, new Object);setMethod.invoke(objCopy, new Objectvalue);return objCopy;public static void main(String args) throws ExceptionCustomer customer = new Customer(Jack,30);customer.setId(1L);ConstructorTest test = new ConstructorTest();Customer customer2 = (Customer)test.copy(customer);System.out.println(customer2.getId()+ , + customer2.getName() + , + customer2.getAge();使用反射创建数组public class ArrayTest2public static void main(String args)int dims = new int5, 10, 15;Object array = Array.newInstance(Integer.TYPE, dims);Object arrObj = Array.get(array, 3);Class classType = arrObj.getClass().getComponentType();System.out.println(classType);arrObj = Array.get(arrObj , 5);Array.setInt(arrObj, 10, 35);int arrCast = (int)array;System.out.println(arrCast3510);public class ArrayTestpublic static void main(String args) throws ExceptionClass classType = Class.forName(java.lang.String);Object array = Array.newInstance(classType, 10);Array.set(array, 5, Jack);Object val = Array.get(array, 5);System.out.println(val);使用反射调用类里的私有方法:public class PrivateTestpublic static void main(String args) throws ExceptionPerson p = new Person();Class classType = p.getClass();Method method = classType.getDeclaredMethod(sayHello ,new ClassString.class);method.setAccessible(true);/压制java的类型检查Object val = method.invoke(p, new ObjectAlens);System.out.println(val);class Personprivate String sayHello(String name)return Hello, + name;public class PrivateTest2public static void main(String args) throws ExceptionPeople p = new People();Class classType = p.getClass();Field field = classType.getDeclaredField(name);field.setAccessible(true);field.set(p, Li

温馨提示

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

评论

0/150

提交评论