黑马程序员技术交流社区

标题: 关于机制反射中的一个问题 [打印本页]

作者: 再见亦是泪    时间: 2013-1-24 16:06
标题: 关于机制反射中的一个问题
本帖最后由 张向辉 于 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不是更好吗 不用取消方问检查,他们之间有什么区别?
作者: yong230    时间: 2013-1-24 16:17
本帖最后由 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);
        }

}
作者: 刘军亭    时间: 2013-1-24 17:32
   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);
        }





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