黑马程序员技术交流社区

标题: 为什么这种构造不报错呢。。用反射就会出问题。。是不... [打印本页]

作者: 李金中    时间: 2014-2-12 13:32
标题: 为什么这种构造不报错呢。。用反射就会出问题。。是不...
本帖最后由 李金中 于 2014-2-12 13:33 编辑

package com.itheima;

import java.lang.reflect.Constructor;


public class reflex {

        public static void main(String[] args)throws Exception
        {        
                Person p1 = new Person("First");//注意 这样可以new
                Constructor cons = Class.forName("com.itheima.Person").getDeclaredConstructor(String.class);//用反射居然就变成类似private的,必须加Declared
                cons.setAccessible(true);
                Person p3 = (Person)cons.newInstance("Third");
               
                System.out.println(p1 + "+" + p3);
        }

}

class Person
{
        Person(String str)//注意 这没有修饰符
        {
                pStr = str;
        }
        
        public String getName()
        {
                return pStr;
        }
        
        public void setName(String str)
        {
                pStr = str;
        }
        
        public String toString()
        {
                return pStr;
        }
        
        private String pStr;
}


查了下 发现 如果一个包内定义的类包括其成员,如果不加修饰符,那么就类似于C++中的friend,可以互相访问。所以 Person p1 = new Person(“first”);
是OK的。
问题是 反射的话 就不认了么?


作者: ↑↓ME→←    时间: 2014-2-12 14:33
我也查了些网上的,说构造方法如果没有写访问修饰符,默认的就是friend,但是java中没有friend访问修饰符,可以理解为default,包级访问权限,即同一个包中的可以访问,而反射Person.class.getConstructor(String.class)是构造方法是public的,用Class.forName("com.itheima.Person").getDeclaredConstructor(String.class)可以忽略访问修饰符,设置可见,就可以直接访问!
作者: ↑↓ME→←    时间: 2014-2-12 14:35
  1. import java.lang.reflect.Constructor;


  2. public class reflex {

  3.         public static void main(String[] args)throws Exception
  4.         {        
  5.                         Person p1 = new Person("First");//注意 这样可以new
  6.                         Constructor cons = Person.class.getConstructor(String.class);//用反射居然就变成类似private的,必须加Declared
  7.                         Person p3 = (Person)cons.newInstance("Third");
  8.                        
  9.                         System.out.println(p1 + "+" + p3);
  10.         }

  11. }

  12. class Person
  13. {
  14.         private String pStr;
  15.         public Person(String str)
  16.         {
  17.                         pStr = str;
  18.         }
  19.        
  20.         public String getName()
  21.         {
  22.                         return pStr;
  23.         }
  24.        
  25.         public void setName(String str)
  26.         {
  27.                         pStr = str;
  28.         }
  29.        
  30.         public String toString()
  31.         {
  32.                         return pStr;
  33.         }
  34. }
复制代码


QQ截图20140212143442.png (51.2 KB, 下载次数: 12)

QQ截图20140212143442.png





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