【问题标题】:How to preserve caller informaion in java dynamic proxy如何在java动态代理中保留调用者信息
【发布时间】:2015-04-29 10:46:57
【问题描述】:

假设我有下面使用动态代理的伪 scala 代码:

trait IClient {
  def multiply(a : Int) = Int
}

class MyInvocationHandler extends InvocationHandler {
  def invoke(proxy: Any, method: Method, args: Array[AnyRef]): AnyRef = {
    //do nothing
}}

class factory[P]() {
  val clientClass = implicitly[ClassTag[P]].runtimeClass

  def getProxy() : P = java.lang.reflect.Proxy.newProxyInstance(
    getClass.getClassLoader,
    Array(clientClass),
    new MyInvocationHandler()).asInstanceOf[P]
}

def main(): Int = {
  (new factory[IClient]).getProxy().multiply(1)
}

现在我想将以下信息传递给 MyInvocationHandler.invoke: 1. multiply(1) 的调用方法“main()” 2.multiply(1) 的 main() 所在的调用者类 3.乘法函数名

我不想在 multiply(1) 中添加更多参数,例如

multiply(callerClassName, callerMethodName, calleeName, 1)

有没有办法在保留原始接口 multiply(Int):Int 的同时将这些清单信息传递给 MyInvocationHandler.invoke?

欣赏任何线索!

【问题讨论】:

    标签: scala dynamic reflection proxy


    【解决方案1】:

    您可以使用堆栈跟踪来找出调用者的特征。但是,如果从不同的线程调用乘法,则必须小心。

    您可以按如下方式访问堆栈跟踪:

    StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()
    

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 2010-11-06
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多