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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 再见亦是泪 中级黑马   /  2013-1-24 16:06  /  1300 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-25 09:55 编辑

package cn.soft.test;

import java.lang.reflect.Field;

public class RelexFiletest {

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

                getFileDemo();
        }

        public static void getFileDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException {
                /*
                 * 获取字节码中的字段
                 */
                Class clazz=Class.forName("cn.soft.p.bean.People");
               
                Field field=null;//clazz.getField("age");//只获取本类,但包含私有。
               
                field=clazz.getDeclaredField("age");//只获取本类,但包含私有
               
                System.out.println(field);
               
                Object obj=clazz.newInstance();
               
                Object o=field.get(obj);
               
                System.out.println(o);
        }

}
这段代码运行结果如
public int cn.soft.p.bean.People.age
Exception in thread "main" java.lang.IllegalAccessException: Class cn.soft.test.RelexFiletest can not access a member of class cn.soft.p.bean.People with modifiers "private"
        at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
        at java.lang.Class.newInstance0(Class.java:349)
        at java.lang.Class.newInstance(Class.java:308)
        at cn.soft.test.RelexFiletest.getFileDemo(RelexFiletest.java:32)
        at cn.soft.test.RelexFiletest.main(RelexFiletest.java:17)

因为我把People里面的public改为了private然后就出现这个,我知道可以不改使用 暴力访问取消权限检查,我在想直接public不是更好吗 不用取消方问检查,他们之间有什么区别?

评分

参与人数 1黑马币 +6 收起 理由
Rancho_Gump + 6 赞一个!

查看全部评分

2 个回复

倒序浏览
本帖最后由 yong230 于 2013-1-24 16:19 编辑

可以暴力访问private字段的,看下面:
import java.lang.reflect.Field;

public class RelexFiletest {

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

                getFileDemo();
        }

        public static void getFileDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException {
                /*
                 * 获取字节码中的字段
                 */
                Class clazz=Class.forName("cn.soft.p.bean.People");
               
                Field field=null;//clazz.getField("age");//只获取本类共有字段。
               
                field=clazz.getDeclaredField("age");//可以获取本类私有和共有字段
                field.setAccessible(true);//这个是暴力设置private字段可以访问

                System.out.println(field);
               
                Object obj=clazz.newInstance();
               
                Object o=field.get(obj);
               
                System.out.println(o);
        }

}

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
   public static void getFileDemo() throws ClassNotFoundException, SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException {
                /*
                 * 获取字节码中的字段
                 */
                Class clazz=Class.forName("cn.soft.p.bean.People");
               
                Field field=null;//clazz.getField("age");//只获取本类,但不包含私有的字段。
               
                field=clazz.getDeclaredField("age");//只获取本类全部字段,看你的出错原因可能你的age字段是私有的,要想访问必须设置访问权限为可                                 
                                                                  //访问的。
                field.setAccessible(true);             //设置字段的访问权限,默认为不可访问的。必须设置为true才可以访问。
                System.out.println(field);
               
                Object obj=clazz.newInstance();
               
                Object o=field.get(obj);
               
                System.out.println(o);
        }

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

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