كيف يمكنني اعتراض تنفيذ جميع الطرق في تطبيق جافا باستخدام رائعة ؟

StackOverflow https://stackoverflow.com/questions/1226821

سؤال

هل من الممكن أن اعتراض كل أساليب يسمى في التطبيق ؟ أود أن تفعل شيئا معهم ، ومن ثم السماح لهم تنفيذ.حاولت تجاوز هذا السلوك في Object.metaClass.invokeMethod, ولكن لا يبدو أن العمل.

هل هذا ممكن ؟

هل كانت مفيدة؟

المحلول

هل نظرت في رائع اوب ؟ هناك القليل جدا الوثائق ، لكنه يسمح لك لتحديد pointcuts والمشورة بطريقة مشابهة من الناحية النظرية بالنسبة للAspectJ. إلقاء نظرة على في وحدة الاختبارات للحصول على بعض من الأمثلة

والمثال التالي سوف تتطابق جميع المكالمات لجميع أنواع المنسوجة وتطبيق المشورة قبل المتابعة:

// aspect MyAspect
class MyAspect {
  static aspect = {
    //match all calls to all calls to all types in all packages
    def pc = pcall("*.*.*")

    //apply around advice to the matched calls
    around(pc) { ctx ->
      println ctx.args[0]
      println ctx.args.length
      return proceed(ctx.args)
    }
  }
}
// class T
class T {
  def test() {
    println "hello"
  }
}
// Script starts here
weave MyAspect.class
new T().test()
unweave MyAspect.class

نصائح أخرى

أولا وقبل كل شيء ، الغلابة Object.metaClass.invokeMethod لا يعمل لأنه عندما رائع يحاول أسلوب الدعوة إلى نوع X ، فإنه يتحقق metaClass X, ولكن ليس metaClass من الفئة الأصل(es).على سبيل المثال التعليمات البرمجية التالية طباعة "طريقة intValue اعترضت"

Integer.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Integer.metaClass = null  

ولكن هذا الرمز لا:

Object.metaClass.invokeMethod = {def name, def args ->
  System.out.println("method $name intercepted")
}

6.intValue()

// Reset the metaClass  
Object.metaClass = null

السؤال كان "هل من الممكن أن اعتراض كل أساليب يسمى في التطبيق؟", ولكن هل يمكن أن يكون قليلا أكثر دقة حول ما إذا كنت ترغب في:

  • اعتراض المكالمات رائع أساليب جافا أساليب أو كليهما
  • اعتراض المكالمات فقط الخاص بك رائع/Java أساليب أو أيضا اعتراض المكالمات رائع/Java مكتبة دروس

على سبيل المثال, إذا كنت تريد فقط لاعتراض المكالمات الخاصة بك رائع الطبقات ، يمكنك تغيير الفصول إلى تنفيذ GroovyInterceptable.هذا يضمن أن invokeMethod() استدعاء كل طريقة تسمى في تلك الطبقات.إذا كانت طبيعة اعتراض (أيالأشياء التي تريد القيام به قبل/بعد استدعاء يسمى الأسلوب) هو نفسه بالنسبة لجميع الطبقات ، يمكنك تحديد invokeMethod() في فئة منفصلة واستخدام @Mixin إلى تطبيقه على جميع فئات الخاصة بك.

بدلا من ذلك, إذا كنت ترغب أيضا في اعتراض المكالمات إلى فئات Java, يجب أن تحقق من DelegatingMetaClass.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top