解决方案 »

  1.   

    newinstance()得到的是Object类型,所以不能直接调用方法。
      

  2.   

    1、反射过程中,要执行invoke方法,说明对象已经存在(除非是执行静态方法),那再newinstance()一个实例岂不是重复?浪费内存。
    2、类有一个隐含的默认的无参构造方法,但现实中很多类为了保护(如单例)而重写了,如果加上了权限修饰,或者指定了参数,这时候newinstance()还能行吗?
      

  3.   

    2楼正解,第一,如果该类可以创建对象,newinstance()浪费内存,第二存在不能实例化,如单例,无空参构造,存在安全管理器等等。附jdk解释:
    IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。 
    InstantiationException - 如果此 Class 表示一个抽象类、接口、数组类、基本类型或 void; 或者该类没有 null 构造方法; 或者由于其他某种原因导致实例化失败。 
    ExceptionInInitializerError - 如果该方法引发的初始化失败。 
    SecurityException - 如果存在安全管理器 s,并满足下列任一条件: 
    调用 s.checkMemberAccess(this, Member.PUBLIC) 拒绝创建该类的新实例 
    调用者的类加载器不同于也不是当前类的类加载器的一个祖先,并且对 s.checkPackageAccess() 的调用拒绝访问该类的包 
      

  4.   


    method.invoke(object, args):执行该Method.invoke方法的参数是执行这个方法的对象object,和参数数组args,那还是要先得到这个类的对象object啊,都有这个类的对象了干嘛还要这么麻烦invoke?还有仅仅知道类全路径字符串如"com.xx.xxx.Person"可以反射得到他的class,不是还是要newinstance()得到object,难道还有别的方法,还是说我理解的不对?
      

  5.   

    2个问题
    1.通常我们使用反射时,传入的这个Object会是一个所有属性都为空的吗?如果使用newinstance重新构建一个对象,这个新对象有什么意义?
    2.我们使用反射仅仅是为了调用方法而跟原来的对象没有关系吗?如果仅仅是这样,那这些方法为什么不直接调用,而必须通过对象呢?
      

  6.   

    很多时候方法是不定的,你没有办法直接调用,比如一个对象,你要根据set方法来注入属性值,你需要根据属性名来生成setXXX方法,这个在你编写程序的时候是不知道对象是什么,属性名称是什么的。更不可能知道有什么set方法,只能够反射通过invoke方法来调用。