为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

java反射机制

2017-09-26 9页 doc 24KB 18阅读

用户头像

is_591137

暂无简介

举报
java反射机制java反射机制 在正常的情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象来找到其中所在的类的信息,这实际上就是class类的功能。 class People{ } public class Demo1{ public static void main(String args[]){ People p=new People(); //实例化People的类的对象 System.out.println(people.getClass().getName()); //得到对象所在...
java反射机制
java反射机制 在正常的情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在java中也允许通过一个对象来找到其中所在的类的信息,这实际上就是class类的功能。 class People{ } public class Demo1{ public static void main(String args[]){ People p=new People(); //实例化People的类的对象 System.out.println(people.getClass().getName()); //得到对象所在的类 } } 上面的操作是反着来的,是通过通过对象得到所在的类。 Object类的支持 在Object类中定义了一下的,此方法将被所有子类继承: public final Class getClass(); 注意上面的方法返回的类型是一个“class”类型,实际上此类是Java反射的源头,实际上所谓从程序的运行结果来看也很好理解,即:可以通过对象反射出类的名称。 正常方式 引入需要的“包.类”名称------》通过new实例化-------》取得实例化的对象 反射方式 实例化对象-------》通过getClass()方法------》得到完整的“包.类”名称 Class类 class本身表示一个类的本身,通过Class可以完整的得到一个类中的完整结构,包括此类中定义的方法,属性等等。 class类常用的方法 1.通过传入一个完整的“包.类”名称实例化Class对象 public static Class forName(String className)throws ClassNotFoundException 2.得到一个类中的全部的构造方法 public Constructor getConstructor()throwsNoSuchMethodException,SecurityException 3.得到本类和父类中的全部属性 public Field[] getDeclaredFields()throws SecurityException 4.得到本类中的全部属性 public Field[] getFields()throws SecurityException 5.得到类中的全部方法 public Method[] getMethods()throws SecurityException 6.返回一个Method 对象并设置一个方法中的多有参数类型 public Method getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException 7.得到类中的全部接口 public Class[] getInterfaces() 8.得到类的名称(包.类) public String getName() 9.得到类所在的包 public Package getPackage()10.得到该类的父类 public Class getSuperclass() 11.根据Class定义的类实例化对象 public T newInstance()throws InstantiationException, IllegalAccessException 12.得到数组类型的Class public Class getComponentType() 13.判断此class是不是一个数组 public boolean isArray() 实例化class类对象 实例化class类对象的方法有三种: 1.通过forName()方法 2. 类.class 3. 对象.getClass() 实例: class People{ } Public class PeopleDemo{ public static void main(String args[]){ Class c1=null; Class c2=null; Class c3=null; try{ // 第一种方式 c1 = Class.forName("com.wangxing.test.People") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } //第二种方式 c2 = new People().getClass() ; //第三种方式 c3 = People.class ; // 得到类的名称 System.out.println("类名称:" + c1.getName()) ; System.out.println("类名称:" + c2.getName()) ; System.out.println("类名称:" + c3.getName()) ; } } Class的使用 class是反射的源头,不光可以获得对象所在类的信息,也可以直接通过class类的的方法 进行对象的实例化操作,正常的情况下,使用关键字new为对象实例化,如果现在已经实 例化好了class对象,则可以通过class类中提供的: public T newInstance() throws InstantiationException, IllegalAccessException 来实例化对象。 例如: class Person{ private String name ; // name属性 private int age ; // age属性 public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } // 覆写toString()方法 public String toString(){ return "姓名:" + this.name + ",年龄:" + this.age ; } } public class InstanceDemo01{ public static void main(String args[]){ Class c = null ; // 声明Class对象 try{ c = Class.forName("com.wangxing.test.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 声明Person对象 try{ per = (Person)c.newInstance() ; // 实例化对象 }catch(Exception e){ e.printStackTrace() ; } per.setName("杜飞强") ; // 设置姓名 per.setAge(24) ; // 设置年龄 System.out.println(per.toString()) ;// 内容输出,调用toString() } } 通过上面的代码可以发现,即使不使用new关键字也可以进行实例化,那就是反射。 但是,在使用以上操作的时候有一点必须注意,在操作中必须存在无参数的构造函数。否则无法实现实例化。 如果要通过指定的构造方法完成实例化,照以下步骤完成: 1.通过Class类中的getConstructors()方法取得本类中的全部的构造方法。 2.向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数。 3.之后通过Constructor实例化对象 在Constructor类中存在一个方法 public T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException,InvocationTargetException 传递初始化参数,以进行对象的实例化操作。 Constructor类的常用方法: 得到构造方法的修饰符 public int getModifiers() 得到构造方法的名称 public String getName() 得到构造方法中的参数类型 public Class[] getParameterTypes() 返回构造方法的信息 public String toString() 明确调用有参数的构造方法,实例化对象: class Person{ private String name ; // name属性 private int age ; // age属性 public Person(String name,int age){ this.setName(name) ; this.setAge(age); } public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public String toString(){ // 覆写toString()方法 return "姓名:" + this.name + ",年龄:" + this.age ; } } public class InstanceDemo03{ public static void main(String args[]){ Class c = null ; // 声明Class对象 try{ c = Class.forName("com.wangxing.test.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 声明Person对象 Constructor cons[] = null ; cons = c.getConstructors() ; try{ // 实例化对象 per = (Person)cons[0].newInstance("杜飞强",24) ; }catch(Exception e){ e.printStackTrace() ; } System.out.println(per.toString()) ;// 内容输出,调用toString() } } 最好能提供无参数构造方法。
/
本文档为【java反射机制】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索