代码之家  ›  专栏  ›  技术社区  ›  zneak

除了序列化,反射访问私有成员的合法用途是什么?

  •  0
  • zneak  · 技术社区  · 15 年前

    反射可以用来访问任何对象的内部,这有点不酷。我试着列出它的合法用途,但最后我只想到了序列化。

    为了访问不可访问的成员,您可以找到使用反射的其他(合法)用途吗?

    编辑 我是说你的东西 不能 如果你没有反省就去做。

    6 回复  |  直到 15 年前
        1
  •  2
  •   Oded    15 年前

    我想到了单元测试。如果要测试私有方法,但不公开该方法或使用 InternalsVisibleToAttribute .

        2
  •  1
  •   Péter Török    15 年前

    一种是将对象持久化到数据库。E、 Hibernate确实使用反射,在某些情况下,比如对象的ID可能是私有成员,带有私有setter/getter,因为它在Java域中没有用处。但是它在数据库中是必需的,所以Hibernate在后台设置/获取它,并使用它来确定对象标识。

    另一种方法是为设计糟糕的遗留代码编写初始单元测试,因为没有单元测试来保护自己,所以不能直接开始重构。在这种情况下,如果其他方法(如 Working Effectively with Legacy Code )无法帮助您,反射可能是开始使用可维护代码的最后手段。

        3
  •  1
  •   ewernli    15 年前

    我猜使用它的一个大领域是在托管环境的上下文中,也就是说,当一个框架或环境应该提供一些工具,并且可能需要访问私有数据时。

    公共/私有访问修饰符是 应用程序设计级别 一个领域不应该为了让一个框架高兴而公开。例如,Hibernate这样的框架可以管理 对象持久性 , 依赖注入 框架,它可以在私有字段中注入数据,或者更一般地 应用服务器 不管访问修饰符是什么,都可以工作。

    更普遍地说,这属于 元编程 . 有些代码在不预先知道其他对象的结构的情况下动态地检查和修改它们。

        4
  •  0
  •   James Black    15 年前

    分析或监视可能是对私有成员和函数使用反射的有用原因。例如,如果您想知道数据库连接实际建立的频率,可以监视对私有数据库的访问 SqlConnection .

    这可以用AOP做得更好,但是,如果试图让AOP被接受在政治上太困难,那么在开发过程中进行反思可以帮助解决问题。

        5
  •  0
  •   akapoor    15 年前

    您还可以使用反射根据输入类型参数(如enum)调用方法,从而基本上替换switch语句。

    例如:

    enter code here
    
       public class Test
       {
        public enum Status
        {
          Add,
          Delete,
          Update
        }
    
        public void Save(Status status)
        {
              //use reflection to obtain corresponding method
               MethodInfo method = this.GetType().GetMethod(status.ToString(),BindingFlags.NonPublic | BindingFlags.Instance);
             //Invoke method here
    
        }
        //you don't want to expose these methods
        private void Add()
        {
    
        }
        private void Delete()
        {
    
        }
        private void Update()
        {
    
        }
    }
    
        6
  •  0
  •   Chris Dodd    15 年前

    调试和分析马上就浮现在脑海中——它们需要能够更完整地查看对象的内部。

    垃圾回收是另一种方式——是的,JVM内置了垃圾回收器,但必须有人编写代码,虽然大多数JVM不是用java编写的,但没有理由不能这样做。