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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李金中 于 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的。
问题是 反射的话 就不认了么?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
我也查了些网上的,说构造方法如果没有写访问修饰符,默认的就是friend,但是java中没有friend访问修饰符,可以理解为default,包级访问权限,即同一个包中的可以访问,而反射Person.class.getConstructor(String.class)是构造方法是public的,用Class.forName("com.itheima.Person").getDeclaredConstructor(String.class)可以忽略访问修饰符,设置可见,就可以直接访问!
回复 使用道具 举报
  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, 下载次数: 11)

QQ截图20140212143442.png

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马