| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | | | |
| 公告 |
| 暂无公告... |
| Blog信息 |
|
blog名称:天地无用 日志总数:55 评论数量:43 留言数量:1 访问次数:195218 建立时间:2008年4月17日 |

| |
|
[java基础]反射与访问控制(转) 软件技术
kkk888929 发表于 2008/7/31 18:30:29 |
| 久闻反射可以破坏私有属性、私有方法的访问控制,一直也没有找到方法 突然看到原来有一个class AccessibleObject 中 的setAccessible 可以设置访问权限 Field、Method 两个类均继承这个类,因此Field 、Method 都可以设置访问权限 下面是个小例子: public class FieldValueGet { /** * @param args * @throws IllegalAccessException * @throws IllegalArgumentException * @throws NoSuchMethodException * @throws SecurityException * @throws InvocationTargetException */ public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchMethodException, InvocationTargetException { FieldValue fv=new FieldValue("unid","name"); Field[]fields=fv.getClass().getDeclaredFields(); /** * 通过get方法正常获取 属性的值 */ for(int i=0;i<fields.length;i++){ System.out.print(fields[i].getName()+":"); String methodName="get"+fields[i].getName().toUpperCase().substring(0, 1) +fields[i].getName().toLowerCase().substring(1); Method method=fv.getClass().getMethod(methodName, new Class[]{}); System.out.println(method.invoke(fv, new Object[]{})); } /** * 利用反射来破坏 java private属性 */ Field.setAccessible(fields, true);//设置所有的 属性都是可访问的 for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); System.out.println(fields[i].getName()+":"+fields[i].get(fv)); } /** * 破坏方法的private 属性 */ Method[] methods=fv.getClass().getDeclaredMethods(); Method.setAccessible(methods, true); System.out.println(methods.length); for (int i = 0; i < methods.length; i++) { methods[i].invoke(fv, new Object[]{}); } } } class FieldValue{ private String unid; private String name; public String getUnid() { return unid; } public String getName(){ return name; } public FieldValue(String unid,String name){ this.unid=unid; this.name=name; } private void getNameAndUnid(){ System.out.println("我是私有方法!!"); } } |
|
|