1. التفكير في جافا
1. قم بتحميل سمات الفئة ورمز مثيل الطريقة من خلال الانعكاس:
/*** java.lang.class هو مصدر الانعكاس* أنشأنا فئة وإنشاء ملف الفئة المقابلة عن طريق التجميع (javac.exe). بعد تحميل (تحميل فئة JVM) ملف الفئة هذا* بعد تحميل ملف الفئة هذا في الذاكرة ، فهو فئة وقت تشغيل مع منطقة ذاكرة التخزين المؤقت. فئة وقت التشغيل هذه عبارة عن مثيل للفصل * يتم تحميل كل فصل وقت التشغيل مرة واحدة فقط ، */ class <DustudExam> clazz = studentexam.class ؛ studentExam studentExam = clazz.newinstance () ؛ System.Err.Println (StudentExam) ؛ system.out.println (clazz) ؛ // field field = clazz.getfield ("id") ؛ // استدعاء السمة المحددة لفئة وقت التشغيل من خلال السمة: السمة هي حقل النوع العام = clazz.getDeclaredfield ("id") ؛ // السمة هي حقل النوع غير العام [] حقول = clazz.getDeclaredFields () ؛ // احصل على جميع الخصائص المعلنة لفئة وقت التشغيل نفسها (لا يمكن لفئة الوالدين القيام بها). يستخدم الفئة الأصل clazz.getfields () ؛ لـ (Field Field2: الحقول) {int i = field2.getModifiers () ؛ نوع السلسلة = modifier.toString (i) ؛ // احصل على نوع بيانات سمة الحقل system.out.println (type) ؛ } field.setAccessible (true) ؛ field.set (studentexam ، 11) ؛ System.err.println (studentExam.getId ()) ؛ // استدعاء الطريقة المحددة لفئة وقت التشغيل من خلال طريقة الانعكاس = clazz.getMethod ("setId" ، integer.class) ؛ Method.Invoke (StudentExam ، 123) ؛ // استدعاء الطريقة المحددة لطريقة فئة وقت التشغيل [] [] clazz.getMethods () ؛ // احصل على جميع الأساليب التي تم إعلانها على أنها عامة في جميع فئات وقت التشغيل وطريقة فئات الوالدين [] الأساليب 2 = clazz.getDeclaredMethods () ؛ // احصل على الطريقة المعلنة في فئة وقت التشغيل نفسه لـ (method method2: methods) {system.out.println (method2.getName ()) ؛ } // * احصل على فئة وقت تشغيل الكائن من خلال طريقة getClass () للكائن ، امتحان exam = new exam () ؛ class clazzexam = exam.getClass () ؛2
/** * الوصف: تحميل الفئة ، تحميل ملف XX.Properties ، وقراءة البيانات * param * Author Xiazhongwei * data 29 سبتمبر ، 2016: 5:32:56 PM * regurn */public void classloader () relhrows ioexception {// method 1. // يتم كتابة المسار ضمن الحزمة: com // apple // OnlineExam // resources // config.properties inputStream instream = loader.getResourCeasStream ("config.properties") ؛ // الطريقة 2. قم بتحميل الملف من المسار المحدد // fileInputStream FileInputStream = جديد fileInputStream (ملف جديد ("config.properties")) ؛ خصائص الخصائص = خصائص جديدة () ؛ properties.load (instream) ؛ // properties.load (fileInputStream) ؛ String Prop = Properties.getProperty ("المجال") ؛ system.out.println (prop) ؛ }3. الوكيل الديناميكي
الوكيل الثابت: يتم تحديد أنواع فئة الوكيل والكائن الهدف أثناء التجميع ، والتي لا تؤدي إلى توسيع البرنامج. في الوقت نفسه ، يمكن لكل فئة وكيل أن تخدم واجهة واحدة فقط ، لذا فإن الكثير من الوكيل سيحدث حتماً في تطوير البرنامج.
الوكيل الديناميكي: يقوم العميل باستدعاء طرق الكائنات الأخرى من خلال فئة الوكيل ، وينشئ ديناميكيًا كائن الوكيل للفئة الهدف حسب الحاجة عند تشغيل البرنامج.
مبادئ نمط تصميم الوكيل:
استخدم وكيلًا للف الكائن ، ثم استبدل الكائن الأصلي باستخدام هذا الكائن الوكيل. يجب أن تكون أي مكالمة إلى الكائن الأصلي من خلال الوكيل ، سواء كان ذلك وعندما يحدد كائن الوكيل ما إذا كان يتم استدعاء الطريقة ومتى
حزمة com.test.junit ؛ استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ import java.lang.reflect.proxy ؛ proxyTest public {public static void main (string [] args) {realSubject realSubject = new RealSubject () ؛ myinvocationHandler myinvocationHandler = new myinvocationHandler () ؛ Object = myinvocationHandler.bind (RealSubject) ؛ موضوع الموضوع = (الموضوع) كائن ؛ الموضوع. }} // استخدام موضوع واجهة الوكيل الديناميكي {void action () ؛} // class realSubject يطرح الموضوع {Override public void Action () {system.out.println ("أنا فئة الوكيل ، تذكر أن أقوم بتنفيذها ...") ؛ }} class myinvocationHandler تنفذ invocationHandler {Object ؛ // إعلان كائن فئة الوكيل من الواجهة/ ** * الوصف: ① instantient كائن الوكيل ② إرجاع كائن فئة proxy * param * @author xiazhongwei * data 29 ، 2016: 4:13:43 this.object = كائن ؛ return proxy.newproxyinstance (object.getClass (). getClassloader () ، object.getClass (). getInterfaces () ، هذا) ؛ } / ** * عندما يتم بدء مكالمة إلى طريقة إعادة الكتابة من خلال كائن من فئة الوكيل ، سيتم تحويله إلى مكالمة إلى طريقة Invok التالية * / Override الكائن العام الاستدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي {الكائن returnoBject = method.invoke (object ، args) ؛ إرجاع الإرجاع ؛ }}4. الوكيل الديناميكي و AOP
مثال 1.
حزمة com.atguigu.spring.aop ؛ الواجهة العامة ARITHMECTMECALCALUTY {int add (int i ، int j) ؛ int sub (int i ، int j) ؛ int mul (int i ، int j) ؛ int div (int i ، int j) ؛} حزمة com.atguigu.spring.aop ؛ استيراد org.springframework.stereotype.component ؛ component ("ArithmeticCalculator") الطبقة العامة ARITHMECTMECALITIMPL تنفذ ARITHMETICCALCulator {Override Public int (int i ، int j) {int result = i + j ؛ نتيجة العودة } Override public int sub (int i ، int j) {int result = i - j ؛ نتيجة العودة } Override public mul (int i ، int j) {int result = i * j ؛ نتيجة العودة } Override public int div (int i ، int j) {int result = i / j ؛ نتيجة العودة }} حزمة com.atguigu.spring.aop ؛ الطبقة العامة الحسابية calculatorLoggingImpl تنفذ ArithmeticCalculator {Override public add (int i ، int j) {system.out.println ("تبدأ الطريقة إضافة [" + i + "،" + j + "]) ؛ int النتيجة = i + j ؛ System.out.println ("الطريقة إضافة نهايات مع" + نتيجة) ؛ نتيجة العودة } Override public int sub (int i ، int j) {system.out.println ("تبدأ الطريقة الفرعية بـ [" + i + "،" + j + "]") ؛ int النتيجة = i - j ؛ system.out.println ("الطريقة الفرعية تنتهي مع" + نتيجة) ؛ نتيجة العودة } Override public int mul (int i ، int j) {system.out.println ("الطريقة التي تبدأ بها mul مع [" + i + "،" + j + "]") ؛ int النتيجة = i * j ؛ System.out.println ("الطريقة التي تبدأ بها mul بـ [" + i + "،" + j + "]") ؛ int النتيجة = i * j ؛ System.out.println ("الطريقة تنتهي MUL بـ" + نتيجة) ؛ نتيجة العودة } Override public int div (int i ، int j) {system.out.println ("تبدأ الطريقة div بـ [" + i + "،" + j + "]") ؛ int النتيجة = i / j ؛ System.out.println ("تنتهي الطريقة div مع" + نتيجة) ؛ نتيجة العودة }} حزمة com.atguigu.spring.aop ؛ استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ import java.lang.reflect.proxy ؛ import java.util.arrays ؛ الفئة العامة الحسابية CALITORLOGGAGEPROXY {// كائن لتكون الوكيل الخاص بالحساب الخاص. الحساب العام calculatorloggingproxy (ArithmeticCalculator Target) {super () ؛ this.target = الهدف ؛ } // إرجاع كائن الوكيل ARITHMECTMECTMECALCulator getLoggingProxy () {ARITHMECTCALCulator proxy = null ؛ // ما هو تحميل فئة من كائن الوكيل المسؤول عن تحميل تحميل classloader = target.getClass (). getClassLoader () ؛ // نوع كائن الوكيل ، أي ما هي الطرق الموجودة فيه. class [] interfaces = new class [] {ArithmeticCalculator.class} ؛ // عند استدعاء طرق كائن الوكيل ، قم بتنفيذ الكود التالي InvocationHandler H = New InvocationHandler () { /*** Proxy: Proxy Object. لا يتم استخدام هذا الكائن عمومًا* الطريقة: الطريقة التي تسمى* args: المعلمات التي تم تمريرها في طريقة الاتصال*/ Override الكائن العام الاستدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) لن يتم استدعاء {// طريقة للكائن الوكيل لن يتم استدعاؤها مباشرة داخل الطريقة. proxy.toString () سوف يتسبب في حلقة ميتة للاتصال بـ invoke method string methodName = method.getName () ؛ // طباعة نظام السجل. // استدعاء طريقة الكائن الهدف = NULL ؛ حاول {// pre-notification result = method.invoke (الهدف ، args) ؛ // إشعار الإرجاع ، يمكنك الوصول إلى قيمة الإرجاع للطريقة} catch (NullPointerException e) {e.printstacktrace () ؛ // الإخطار الاستثناء ، يمكنك الوصول إلى استثناء الطريقة} // بعد تحديد. نظرًا لأن الطريقة قد يكون لها استثناء ، لا يمكن الوصول إلى قيمة إرجاع الطريقة // print log system.out.println ("[بعد] تنتهي الطريقة بـ" + نتيجة) ؛ نتيجة العودة }} ؛ /*** loader: محمل الفئة المستخدمة بواسطة كائن الوكيل. * واجهات: حدد نوع كائن الوكيل. وهذا هو ، ما هي الطرق التي يمكن العثور عليها في كائن الوكيل الوكيل. * H: عند استدعاء طريقة كائن الوكيل ، كيف يجب أن يستجيب؟ في الواقع ، هو استدعاء طريقة invoke لـ invocationHandler*/ proxy = (ArithmeticCalculator) proxy.newproxyinstance (loader ، interfaces ، h) ؛ عودة الوكيل. }} حزمة com.atguigu.spring.aop ؛ استيراد org.springframework.context.applicationContext ؛ استيراد org.springframework.context.support.classpathxmlapplicationContext ؛ الفئة العامة الرئيسية {public static void main (string [] args) {// ArithmeticCalculator ArithmeticCalculator = new ArithmeticCalculatorImpl () ؛ ARITHMECTCALCulator ARITHMECTMECALCulator = new ARITHMETICCALATORLOGGAGETIMPL () ؛ ArithmeticCalculator = new ArithmeticCalculatorLoggingProxy (ArithmeticCalculator) .getLoggingProxy () ؛ int النتيجة = الحسابية calculator.add (11 ، 12) ؛ System.out.println ("النتيجة:" + نتيجة) ؛ النتيجة = الحسابية. System.out.println ("النتيجة:" + نتيجة) ؛ }}مثال 2.
حزمة com.test.junit ؛ استيراد java.lang.reflect.invocationHandler ؛ استيراد java.lang.reflect.method ؛ import java.lang.reflect.proxy ؛ proxyTest public {public static void main (string [] args) {realSubject realSubject = new RealSubject () ؛ myinvocationHandler myinvocationHandler = new myinvocationHandler () ؛ Object = myinvocationHandler.bind (RealSubject) ؛ موضوع الموضوع = (الموضوع) كائن ؛ الموضوع. }} // استخدام موضوع واجهة الوكيل الديناميكي {void action () ؛} // class realSubject يطرح الموضوع {Override public void Action () {system.out.println ("أنا فئة الوكيل ، تذكر أن أقوم بتنفيذها ...") ؛ }} class myinvocationHandler تنفذ invocationHandler {Object ؛ // إعلان كائن فئة الوكيل من الواجهة/ ** * الوصف: ① instantient كائن الوكيل ② إرجاع كائن فئة proxy * param * @author xiazhongwei * data 29 ، 2016: 4:13:43 this.object = كائن ؛ return proxy.newproxyinstance (object.getClass (). getClassloader () ، object.getClass (). getInterfaces () ، هذا) ؛ } / ** * عندما يتم بدء مكالمة إلى طريقة إعادة الكتابة من خلال كائن من فئة الوكيل ، سيتم تحويله إلى مكالمة إلى طريقة Invok التالية * / Override الكائن العام الاستدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي {الكائن returnoBject = method.invoke (object ، args) ؛ إرجاع الإرجاع ؛ }}شكرًا لك على قراءة هذا المقال ، آمل أن يساعدك. شكرا لك على دعمك لهذا الموقع!