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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨鹏鹏 中级黑马   /  2012-8-24 13:57  /  1589 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨鹏鹏 于 2012-8-24 13:58 编辑

public static void main(String[] args) throws SecurityException, Exception {
                // TODO Auto-generated method stub
                /* ---------------------------     构造函数       ----------------------------  */
            Person p=new Person(); //①这儿用Class.forName("com.itheima.threed1.Reflection")错
            Constructor con= p.getClass().getConstructor(int.class,String.class);//有参构造函数
            con.setAccessible(true);
            Person p1=(Person)con.newInstance(3,"周星驰");
            System.out.println(p1.toString());
          //System.out.println(p1.name+p1.age);//②出错,The field Person.age is not visible
            System.out.println( Person.class.newInstance().toString());//无参构造函数
            Constructor[] cons=Person.class.getConstructors();
            System.out.println("个数为"+cons.length);
            for(Constructor c:cons){
                    //③怎么判断是否为有参构造函数
                    //System.out.println(c.newInstance(10,"爱我中华").toString());//出错。
                    //System.out.println(c.newInstance().toString());//错
            }
             /*  --------    获取方法          -------------                      */
            //私有的静态方法
            Method m3=Person.class.getDeclaredMethod("getS", String.class);
            m3.setAccessible(true);//私有方法
            System.out.println( m3.invoke(null, "你好,我也好"));//④你好,我也好  null(这个null怎么来滴)


        }

}
class Person
{
        
        public Person() {
               
        }
        
        public Person(int age, String name) {
                this.age = age;
                this.name = name;
        }

        private  int  age=10;
        public  String name="张三";
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
    public void getArrays(int[] i){
            for(Integer a:i){
                    System.out.println(a);
            }
    }
    @Override
    public String toString(){
            return name+"哈哈,找到我了"+age;
    }
   private static void getS(String a){
            System.out.println(a);
    }
}

①处用Class.forName("com.itheima.threed1.Reflection") 读不到数据?
② 处 无法读取private 变量 尽管  con.setAccessible(true);?
③怎么判断是否为有参构造函数 ?
④你好,我也好  null(这个null怎么来滴) ?


2 个回复

倒序浏览
本帖最后由 杜鹏云 于 2012-8-24 15:51 编辑

Person p=new Person(); //①这儿用Class.forName("com.itheima.threed1.Reflection")错,不知道你要反射哪个类??Person还是Refection           Constructor con= p.getClass().getConstructor(int.class,String.class);//有参构造函数
           con.setAccessible(true);//这句代码没多大意义..因为你的构造函数都是公有的           
           Person p1=(Person)con.newInstance(3,"周星驰");
           System.out.println(p1.toString());
         //System.out.println(p1.name+p1.age);//②你的age是私有变量,类外访问不到的  你构造函数的con.setAccessible(true)并不能代表字段的Accessible,所以你必须设置字段对象的可访问行性
         System.out.println( Person.class.newInstance().toString());//无参构造函数
           Constructor[] cons=Person.class.getConstructors();
           System.out.println("个数为"+cons.length);
           for(Constructor c:cons){
                   //③怎么判断是否为有参构造函数
                   //System.out.println(c.newInstance(10,"爱我中华").toString());//出错。
                   //System.out.println(c.newInstance().toString());//错
                   /*
                    * 下面有如何判断是否为有参构造函数
                    */
                   Class<?>[] cs=c.getParameterTypes();
                   if(Arrays.asList(cs).size()!=0)
                   {/*
                       Arrays.asList(cs)将一个Class数组转换为一个List,打印输出参数类型!
                   */
                  
                     System.out.println("该构造函数参数类型为:"+Arrays.asList(cs));
                   }
                   else
                   {
                           System.out.println("该构造函数无参构造函数");
                   }
                  
                   //
           }
            /*  --------    获取方法          -------------                      */
           //私有的静态方法
           Method m3=Person.class.getDeclaredMethod("getS", String.class);
           m3.setAccessible(true);//私有方法
           System.out.println(m3.invoke(null,"你好,我也好"));//④你好,我也好  null(这个null怎么来滴)
         //JDK对于invoke有这样的解释
          /*
           *  如果方法正常完成,则将该方法返回的值返回给调用者;
           *  如果该值为基本类型,则首先适当地将其包装在对象中。
           *  但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;
           *  换句话说,将返回基本类型的数组。
           *  如果底层方法返回类型为 void,则该调用返回 null,所以如果你不打印m3.invoke(null,"你好,我也好")
           *  结果自然就没有null.
           */
回复 使用道具 举报
嗯,多谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马