`
yun70345
  • 浏览: 4798 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

通过反射可以访问私有变量、方法

F# 
阅读更多
今天学习RTTI的时候,发现通过反射可以访问私有方法、也可以改变私有变量的值,这样来说的话private 是不是基本没有意义了啊?!
public class User {

    private String name;
    private int age=25;
    public String sex;
    

    private String getName(){
        System.out.println("进来获得名字的方法了");
        return "yun70345";
    }
    public String getSex(){
        return "man";
    }
}



测试类如下:
public class TestMain {

    public static Object acessPrivateMethod(Object o,String methodName) throws Exception{
       /*获得所有的方法
        Method []Methods=o.getClass().getDeclaredMethods();
        for (Method method : Methods) {
            System.out.println(method.getName());
        }
        */
        //获得所有属性名字
        Field []fields=o.getClass().getDeclaredFields();
        for (Field f : fields) {
            System.out.println(f.getName());
            if(f.getName().equals("age")){
                f.setAccessible(true);
                f.set(o, 24);//改变私有变量age的值
                System.out.println(f.get(o));
            }
        }
         
        Method m=o.getClass().getDeclaredMethod(methodName);
        m.setAccessible(true);
       return  m.invoke(o);
    }
    
    public static void main(String[]args) throws Exception{
        User u=User.class.newInstance();
        String sex=u.getSex();
        System.out.println("性别:"+sex);
        System.err.println("使用反射访问私有方法:");
        String s=(String) acessPrivateMethod(u,"getName");
        System.out.println("名字:"+s);
    }
}
分享到:
评论

相关推荐

    Java反射访问私有变量和私有方法.doc

    Java反射访问私有变量和私有方法

    C#net反射实现访问类中的私有变量或者方法

    C#net反射实现访问类中的私有变量或者方法

    C++访问类中私有成员变量的方法

    原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有是是通过友元访问。但是!但如果没有get、set方法都没有提供,也没有定义友元,比如使用...

    Java对类私有变量的暴力反射技术讲解

    今天小编就为大家分享一篇关于Java对类私有变量的暴力反射技术讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    ReflectUtils.java

    反射工具类,用来访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数

    day021-反射和注解笔记和代码.rar

    私有化方法、字段、构造方法都必须破坏封装才能使用: public void setAccessible(boolean flag) true表示破坏封装,false是不破坏 是哪个private修饰的方法、字段、构造方法需要执行,就需要用...

    你不知道的JAVA高级应用

    2.反射,暴力反射,和静态做斗争,暴力反射,setAccessible 无论公有私有都可以用来访问 3.动态代理 在调用这个目标方法前,后,2头,异常处都可以动态的加上自己需要逻辑判断,而且根据反射来动态的替换实现类,大大提升了...

    jTester使用指南(带书签).pdf

    访问私有变量 使用反射方式构造对象实例 第 7 章 在测试代码中使用Mock 静态mock,new MockUp的使用 mock构造函数和静态代码块 new MockUp和spring的集成 针对静态mock做断言 动态mock,new Expectations的使用

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...

    gomonkey:gomonkey是一个使单元测试中的猴子修补变得容易的库

    特征支持功能补丁支持成员方法的补丁支持接口补丁支持功能变量的补丁支持全局变量的补丁支持功能指定顺序的补丁支持成员方法指定序列的补丁支持接口指定顺序的补丁支持功能变量指定序列的补丁笔记如果启用了内联,go...

    JAVA面试题最全集

    将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时...

    21天学通Java-由浅入深

    240 12.2.1 创建局部内部类 240 12.2.2 在局部内部类中访问外部类成员变量 240 12.2.3 在局部内部类中访问外部类的局部变量 241 12.2.4 静态方法中的局部内部类 243 12.3 静态内部类 244 12.3.1 创建静态内部类 244 ...

    插件式GIS应用框架的设计与实现

    2.3.1 属性——合理冲破私有变量访问限制 2.3.2 动手——从宿主程序开始 2.4 框架通信契约设计 2.4.1 IPlugin接口 2.4.2 ICommand接口 2.4.3 ITool接口 2.4.4 IItemDef接口和实现 2.4.5 IMenuDef接口 2.4.6...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    17.7.3 简化语法3:局部变量不需要手动包装到类中即可传给回调方法 17.8 委托和反射 第18章 定制attribute 18.1 使用定制attribute 18.2 定义自己的attribute类 18.3 attribute的构造器和字段/属性的数据类型 ...

    net学习笔记及其他代码应用

    private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面...

Global site tag (gtag.js) - Google Analytics