黑马程序员技术交流社区

标题: 反射获取构造方法(Constructor类) [打印本页]

作者: jiaweizhang    时间: 2015-9-22 15:35
标题: 反射获取构造方法(Constructor类)
Constructor类: 它的实例对象表示某个类中的一个构造方法
  1 得到某个类所有的构造方法 ,保存在一个Constructor类型的数组中
      例:Constructor[] constructor = Class.forNamme("java.lang.String").getConstructors();

  2 得到某各类其中的一个构造方法,根据构造方法的参数类型和个数获取
      例:Constructor constructor = Class.froName("java.lang.String").getConstructor(StringBuffer.class);
          Constructor constructor = Class.froName("java.lang.String").getConstructor(StringBuffer.class, int.class);
          StringBuffer.class 是该构造方法的参数类型,.getConstructor(StringBuffer.class)代表获取一个参数类型是StringBuffer的构造方法
          
  3 newInstance()方法,获得一个类的实例对象
      获得步骤:获得类Class实例对象 --> 获得Constructor构造方法 ---> 获得Object实例对象

      代码实例:获取String类的实例对象

   import java.lang.reflect.Constructor;
   import java.lang.reflect.InvocationTargetException;

   public class StringReflection {
        public static void main(String []args){
                /**
                 * 练习:用反射机制实现,获取String类对象,
                 */
               
                Class cls = null;
                Constructor constructor = null;
                String str = null;
                try {
                        //1.获取String类的Class实例对象
                         cls = Class.forName("java.lang.String");
                         
                         //2.根据参数类型,获取String类对应的构造方法
                         constructor = cls.getConstructor(String.class);        //String.class 对象参数类型,格式是参数类型.class       
                         
                         //3.获取String对象,constructor.newInstance("abc")表示用该类构造方法来创建该构造方法的声明类的新实例,
                         //并用指定的初始化参数初始化该实例,这里编译时不知constructor是属于谁的构造方法,所以这里强制转型一下
                         str = (String)constructor.newInstance("abc");        //newInstance("abc") 相当于new new String("abc");
                         //取得str对象可以进行操作
                         System.out.println(str.charAt(2));
                         System.out.println(str);
                } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchMethodException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InstantiationException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InvocationTargetException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}


        Class类也有newInstance()方法,它返回的是无参构造函数的对象




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2