A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄敏 中级黑马   /  2012-8-22 17:22  /  2575 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题看下面红色标注部分,望老鸟给予详细解答,搞不清楚问题,后面很难学懂得

import java.io.FileReader;
import java.lang.reflect.Constructor;


public class ReflectDemo2 {


        /**
         * @param args
         * @throws Exception
         * @throws InstantiationException
         * @throws ClassNotFoundException
         */
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, Exception {


                createNewObject_2();
               
        }
       
        public static void createNewObject_2() throws Exception {
               
//                cn.itcast.bean.Person p = new cn.itcast.bean.Person("小强",39);
               
                /*
                 * 当获取指定名称对应类中的所体现的对象时,
                 * 而该对象初始化不使用空参数构造该怎么办呢?
                 * 既然是通过指定的构造 函数进行对象的初始化,
                 * 所以应该先获取到该构造函数。 通过字节码文件对象即可完成。
                 * 该方法是:getConstructor(paramterTypes);
                 *
                 */
                String name = "cn.itcast.bean.Person";

                //找寻该名称类文件,并加载进内存,并产生Class对象。
                Class clazz = Class.forName(name);

                //获取到了指定的构造函数对  象。
                Constructor constructor = clazz.getConstructor(String.class,int.class);         //getConstructor(String.class,int.class)中的参数是怎么确定?为什么就是String.class和int.class,参数类型为什么又写成(String.class,int.class)这种形式的呢?知道是通过getConstructor方法获得Person类中的构造方法的,Person类中的构造方法是 Person(String name, int age),假如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的?


                //通过该构造器对象的newInstance方法进行对象的初始化。
                Object obj = constructor.newInstance("小明",38);
                       
        }
}


评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
帮顶!!!回一下下啊
回复 使用道具 举报
为什么就是String.class和int.class

这是由Class类的getConstructor的参数决定的:要求是Class对象的一个数组,即有构造器多少个参数,就传递多少个Type.class进方法
public Constructor<T> getConstructor(Class<?>... parameterTypes)
                              throws NoSuchMethodException,
                                     SecurityException

Class是怎么知道这个Person类中有几个构造方法?有参构造函数的参数个数的?

就跟你知道类名,public方法名一样,如果构造器是public的,就能通过doc命令,或者API查询到这些资料吧,不然反射也就没法做了
没有已知条件,怎么解题呢

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 看下楼下的,嘿嘿

查看全部评分

回复 使用道具 举报
反射的本质就是将类中所有的类成分映射成对应的Class对象,这里的Class对象其实可以看成一种类型。
  Class 类的实例表示正在运行的 Java 应用程序中的类和接口。
   基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字   void 也表示为 Class 对象。(形如int.class)
  参数类型为什么又写成(String.class,int.class)这种形式的呢??这个sun公司就是这么定义的,你    知道他表示什么就行了,这是规则。
getConstructor(Class<?>... parameterTypes)
          返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
          Class<?>... parameterTypes指定构造函数的类型,当然如果你传递的是一个空参,那么会调用默认构造函数。
如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的?
第一:你可以这么处理:
Constructor<?>  [] getConstructors()
          返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法 。Constructor<?>就表示你对应的构函不知道形参类型未知。
第二 :遍历Constructor,利用其提供的方法获取对应构函的信息
Type[]  getGenericParameterTypes()
          按照声明顺序返回一组 Type 对象,这些对象表示此 Constructor 对象所表示的方法的形参          类型。Type[]数组自然会返回你的某个构函的参数个数
Class<?>[] getParameterTypes()
          按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。
Constructor<?>[] constructors = clazz.getConstructor();
  for(Constructor<?>cons:constructors )
{
    Type[] types=cons.getGenericParameterTypes()
          System.out.println(cons.toString()+types.length);
}




评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
Person类中的构造方法是 Person(String name, int age),  Constructor constructor = clazz.getConstructor(String.class,int.class);   根据构造器里参数的类型,反射就用 参数对应的类型.class.同时class只有一份,所以能识别。假如现在不知道Person类中的有参构造方法中的参数有几个呢?,Class是怎么知道这个Person类中有参构造函数的参数个数的? 这个我也不清楚,我认为可能是调用默认的无参构造吧

回复 使用道具 举报
public Constructor<?>[] getConstructors()
                                 throws SecurityException返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。如果该类没有公共构造方法,或者该类是一个数组类,或者该类反映一个基本类型或 void,则返回一个长度为 0 的数组。 注意,此方法返回 Constructor<T> 对象的数组(即取自此类构造方法的数组)时,此方法的返回类型是 Constructor<?>[],不是 预期的 Constructor<T>[]。此少量信息的返回类型是必需的,因为从此方法返回之后,该数组可能被修改以保存不同类的 Constructor 对象,而这将违反 Constructor<T>[] 的类型保证。

这个方法,可以获取到,所有的,公共的构造方法,打印出来,看看就知道有哪些了,

至于那个地方为什么是,.class,  是因为反射机制的运行原理来决定的,反射就是通过解析这些Class文件,知道,里面有哪些类,哪些方法。
而不需要,软件扩展者来该程序的源码。

和JAVA一样,javac编译运行,需要java文件,java 运行程序需要加载class,
反射也一直直接解析,class,来获取里面的信息,

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
多看看API,会有帮助
回复 使用道具 举报
黄敏 中级黑马 2012-8-23 08:48:08
8#
问题已解决,谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马