私有方法的查找方式

 

    59: def adjust_sequence
 => 60:   binding.pry
    61:   self.class.
    62:     where(sortable_conditions).
    63:     where('sequence > ?',sequence).update_all("sequence = sequence - 1")
    64: end

 

[1] pry(#<RecommendedVideo>)> sortable_conditions
=> {}
[2] pry(#<RecommendedVideo>)> super.sortable_conditions
NoMethodError: super: no superclass method `adjust_sequence' for #<RecommendedVideo:0x007f11ef8971e8>
from /home/wz/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activemodel-4.2.5/lib/active_model/attribute_methods.rb:430:in `method_missing'
[3] pry(#<RecommendedVideo>)> self
=> #<RecommendedVideo:0x007f11ef8971e8
 id: 28,
 video_id: "XODI0OA==",
 url: "",
 title: "最美是你 TV版",
 video_type: "show",
 version: "",
 homepage_channel_id: "2",
 created_by: "",
 updated_by: "",
 current_update: "",
 show_id: "ad054ed6d9e911e0a046",
 pay_type: "0",
 paid: "0",
 state: 0,
 sequence: 1,
 created_at: Thu, 24 Mar 2016 18:27:05 CST +08:00,
 updated_at: Thu, 24 Mar 2016 18:56:23 CST +08:00>
[4] pry(#<RecommendedVideo>)> self.sortable_conditions
NoMethodError: private method `sortable_conditions' called for #<RecommendedVideo:0x007f11ef8971e8>
from /home/wz/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/activemodel-4.2.5/lib/active_model/attribute_methods.rb:430:in `method_missing'

原因是私有方法不能显示的调用

[14] pry(#<RecommendedVideo>)> self.send :sortable_conditions
=> {}

 

查看方法调用及方法所在处

[10] pry(#<RecommendedVideo>)> self.class.instance_method :sortable_conditions
=> #<UnboundMethod: RecommendedVideo#sortable_conditions>
[11] pry(#<RecommendedVideo>)> m = self.class.instance_method :sortable_conditions
=> #<UnboundMethod: RecommendedVideo#sortable_conditions>
[12] pry(#<RecommendedVideo>)> m.source
=> "    def sortable_conditions\n      {}\n    end\n"
[13] pry(#<RecommendedVideo>)> m.source_location
=> ["/home/wz/workspace/ott-remote-cms/app/models/recommended_video.rb", 123]

 

转载于:https://www.cnblogs.com/iwangzheng/p/5316792.html

在Java中,反射机制允许我们在运行时动态地获取、创建和修改程序结构的信息,包括访问私有(private)、受保护(protected)以及静态(static)方法。要通过反射访问静态的私有方法,你需要按照以下步骤操作: 1. 获取Class对象:首先,需要获取包含该方法的Class对象。这通常通过名字符串或已有的实例对象来完成。 ```java Class<?> clazz = MyClass.class; ``` 2. 调用getDeclaredMethod()或getMethod()方法:然后,你可以分别使用`getDeclaredMethod()`(如果该方法不是final并且在一个包内可见)或`getMethod()`(如果它是public或声明为包可见),提供方法名、参数型等信息。 - 对于`getDeclaredMethod()`: ```java Method method = clazz.getDeclaredMethod("myPrivateStaticMethod", parameterTypes); ``` - 对于`getMethod()`,注意这只会查找公开的同名方法: ```java Method method = clazz.getMethod("myPrivateStaticMethod", parameterTypes); ``` 3. 调用invoke()方法:有了Method对象,就可以使用`invoke()`方法来调用该私有静态方法。记得传入方法需要的所有参数。 ```java Object result = method.invoke(null); // 静态方法不需要实例,null代表本身 ``` 4. 检查权限:由于是私有方法,通常情况下外部无法直接调用,因此可能会抛出IllegalAccessException异常。确保你在适当的位置处理这个异常。 重要提示:反射应谨慎使用,因为它打破了封装,可能导致难以调试的问题,并且不符合“开闭原则”。只有在确实有必要的情况下,例如单元测试或动态配置时才使用反射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值