获取类类型

//获得类类型的两种方式
      1、 Class cls1 = Role.class;
      2、  Class cls2 = Class.forName("yui.Role");

  注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常。

  现在得到cls1就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器

  Object o = cls1.newInstance(); //创建一个实例 

      //Object o1 = new Role();   //与上面的方法等价

  这样就创建了一个对象,缺点是我们只能利用默认构造函数,因为Class的newInstance是不接受参数的,后面会讲到可接受参数的newInstance

  第二,如果类的构造函数是private的,比如Class,我们仍旧不能实例化其对象。

  首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象

  public Constructor<?>[] getConstructors()      返回类中所有的public构造器集合,默认构造器的下标为0

  public Constructor<T> getConstructor(Class<?>... parameterTypes)   返回指定public构造器,参数为构造器参数类型集合

  public Constructor<?>[] getDeclaredConstructors()  返回类中所有的构造器,包括私有

  public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器

  从名字来看,还是很好懂的,带上Declared的都是获得所有的构造方法,包括私有

  //指定参数列表获取特定的方法  
      Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class}); //获取含有只有一个String
      con.setAccessible(true); //设置可访问的权限  
      Object obj = con.newInstance(new Object[]{"liyang"}); //注意这里Constructor的newInstance方法就可以设置参数了
      System.out.println(obj);  //打印一下这个对象的信息

  public Field getDeclaredField(String name)  获取任意指定名字的成员
  public Field[] getDeclaredFields()             获取所有的成员变量
  public Field getField(String name)           获取任意public成员变量
  public Field[] getFields()                          获取所有的public成员变量

  其他的非构造方法获取也是类似的

posted @ 2014-07-11 11:42  风中鸣,雨中行  阅读(281)  评论(0编辑  收藏  举报