تقع فئة الوكيل الديناميكي Java تحت حزمة java.lang.reflect ، وتتضمن بشكل عام الفئتين التاليتين:
(1) InvocationHandler: يتم تعريف طريقة واحدة فقط في هذه الواجهة
استدعاء الكائن العام (كائن OBJ ، طريقة الطريقة ، الكائن [] args)
في الاستخدام الفعلي ، تشير المعلمة الأولى OBJ عمومًا إلى فئة الوكيل ، الطريقة هي طريقة الوكيل ، مثل الطلب () في المثال أعلاه ، ARGS هي صفيف المعلمة للطريقة. يتم تنفيذ هذه الطريقة التجريدية ديناميكيًا في فئة الوكيل.
(2) الوكيل: هذه الفئة هي فئة وكيل ديناميكي ، ووظائفها تشبه proxysubject في المثال أعلاه ، والتي تحتوي بشكل أساسي على المحتويات التالية المحمية الوكيل (InvocationHandler H): مُنشئ ، يستخدم لتعيين القيم إلى ح.
فئة ثابتة getproxyclass (تحميل classloader ، فئة [] واجهات)
احصل على فئة بالوكالة حيث يكون المحمل هو المحمل والواجهات هي مجموعة من جميع الواجهات التي تملكها الفئة الحقيقية.
كائن ثابت NewProxyInstance (Loader ClassLoader ، فئة [] واجهات ، InvocationHandler H)
إرجاع مثيل من فئة الوكيل.
ما يسمى الوكيل الديناميكي هو فئة: إنه فئة تم إنشاؤها في وقت التشغيل. بالطبع يمكنك استخدام مثيل الفصل مثل أي من هذه الواجهات. بطبيعة الحال ، فإن هذا الوكيل الديناميكي هو في الواقع وكيل ، والذي لن يقوم بعمل كبير بالنسبة لك.
عند استخدام فئات الوكيل الديناميكي ، يجب علينا تنفيذ واجهة InvocationHandler:
انظر البرنامج الموضوع. java
انظر البرنامج realsubject.java
انظر برنامج DynamicSubject.java
انظر البرنامج client.java
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
// الدور التجريدي (سابقًا كان فئة مجردة ، يجب تغييره إلى واجهة هنا):
موضوع الواجهة العامة
{
مجردة طلب الفراغ العام () ؛
}
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
// دور محدد
الطبقة العامة realSubject يطرح موضوع
{
الجمهور الحقيقي ()
{
}
طلب الفراغ العام ()
{
System.out.println ("من الموضوع الحقيقي.") ؛
}
}
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
استيراد java.lang.reflect.invocationHandler ؛
استيراد java.lang.reflect.method ؛
// معالج الوكيل
/**
* الخصائص الداخلية لفئة الوكيل هي فئة كائن.
* بالإضافة إلى ذلك ، يتم تنفيذ طريقة الاستدعاء أيضًا في هذه الفئة ، method.invoke (sub ، args) ؛
* في الواقع ، هو استدعاء الطريقة التي سيتم تنفيذها بواسطة كائن الوكيل.
* args هي المعلمة اللازمة لإجراء العملية المقابلة لكائن الوكيل.
* من خلال فئات الوكيل الديناميكي ، يمكننا إجراء بعض العمليات ذات الصلة قبل أو بعد المكالمة
*/
الطبقة العامة DynamicSubject تنفذ InvocationHandler
{
كائن خاص فرعي ؛
DynamicSubject ()
{
}
DynamicSubject (كائن OBJ)
{
الفرعية = OBJ ؛
}
الكائن العام استدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي القابلة للتسمية
{
System.out.println ("قبل الاتصال" + طريقة) ؛
method.invoke (sub ، args) ؛
System.out.println ("بعد الاتصال" + طريقة) ؛
العودة لاغية.
}
}
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
استيراد java.lang.reflect.invocationHandler ؛
استيراد java.lang.reflect.proxy ؛
//عميل
عميل الطبقة العامة
{
سحق الفراغ العام الثابت (سلسلة [] args) رمي رمي
{
realSubject RS = جديد realSubject () ؛
InvocationHandler DS = New DynamicSubject (RS) ؛
الفئة <؟> cls = rs.getClass () ؛
// فيما يلي وكيل جيل لمرة واحدة
الموضوع = (الموضوع) proxy.newproxyinstance (
cls.getClassLoader () ، cls.getInterfaces () ، ds) ؛
الموضوع. request () ؛
}
}
مثال 2:
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
استيراد java.lang.reflect.invocationHandler ؛
استيراد java.lang.reflect.method ؛
استيراد java.lang.reflect.proxy ؛
استيراد java.util.list ؛
استيراد java.util.vector ؛
الطبقة العامة VectorProxy تنفذ InvocationHandler
{
كائن خاص proxyobj ؛
Public VectorProxy (Object OBJ) {
proxyobj = obj ؛
}
مصنع كائن ثابت عام (كائن OBJ) {
class <؟> cls = obj.getClass () ؛
return proxy.newproxyinstance (cls.getClassloader () ، cls.getInterfaces () ، new VectorProxy (OBJ)) ؛
}
الكائن العام استدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) يلقي رمي {
System.out.println ("قبل الاتصال" + طريقة) ؛
if (args! = null) {
لـ (int i = 0 ؛ i <args.length ؛ i ++) {
System.out.println (args [i] + "") ؛
}
}
Object = method.invoke (proxyobj ، args) ؛
System.out.println ("بعد الاتصال" + طريقة) ؛
كائن إرجاع ؛
}
suppressWarnings ("غير محدد")
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
قائمة <Tring> v = (List <String>) Factory (ناقل جديد <String> (10)) ؛
V.Add ("جديد") ؛
V.Add ("York") ؛
System.out.println (V) ؛
v.remove (0) ؛
System.out.println (V) ؛
}
}
مثال 3.
نسخة الكود كما يلي:
حزمة com.langsin.dynamicproxy ؛
الواجهة العامة foo {
void doaction () ؛
}
حزمة com.langsin.dynamicproxy ؛
الفئة العامة fooimpl تنفذ foo {
FOOIMPL () العام {
}
public void doaction () {
system.out.println ("in fooimp1.doaction ()") ؛
}
}
حزمة com.langsin.dynamicproxy ؛
الفئة العامة fooimpl2 تنفذ foo {
عام fooimpl2 () {
}
public void doaction () {
system.out.println ("in fooimp2.doaction ()") ؛
}
}
حزمة com.langsin.dynamicproxy ؛
استيراد java.lang.reflect.invocationHandler ؛
استيراد java.lang.reflect.method ؛
الطبقة العامة CommonInvocationHandler تنفذ InvocationHandler {
// التنفيذ الديناميكي للكائنات ، والكائنات التي تتطلب عمليات الاسترجاعات
هدف الهدف الخاص ؛
// حقن منشئ الدعم
Public CommonInvocationHandler () {
}
// حقن منشئ الدعم
Public CommonInvocationHandler (هدف الكائن) {
Settarget (الهدف) ؛
}
/**
*
* استخدم طريقة Setter للحقن
*
* @Param Target
*
*/
public void settarget (الهدف الكائن) {
this.target = الهدف ؛
}
/**
*
* استدعاء الطريقة المحددة بالوكيل وتمرير في قائمة المعلمات ARGS
*
* Param Proxy
* نوع فئة الوكيل ، مثل تحديد واجهة الوكيل المقابلة للطريقة
*
* طريقة param
* طريقة كونك وكيل
*
* param args
* المعلمات التي تستدعي طريقة الوكيل
*
* @يعود
*
* throws java.lang.throwable
*
*/
الكائن العام استدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) يلقي رمي {
طريقة العودة. invoke (الهدف ، args) ؛
}
}
حزمة com.langsin.dynamicproxy ؛
استيراد java.lang.reflect.proxy ؛
تجريبي الطبقة العامة {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
// 1. تنفيذ الوكيل الديناميكي العام
CommonInvocationHandler Handler = New CommonInvocationHandler () ؛
فو و ؛
// 2. تطبيق الواجهة 1
Handler.SetTarget (New Fooimpl ()) ؛
// طريقة المعلمة الوصف: فئة الوكيل ، قائمة تنفيذ فئة الوكيل ، معالج فئة الوكيل
// ربط فئة الوكيل وأساليب الواجهة والمعالجات في فئة الوكيل.
// إذا لم تنفذ فئة الوكيل قائمة الواجهة المحددة ، فسيتم طرح استثناء معلمة غير قانوني
f = (foo) proxy.newproxyinstance (foo.class.getClassloader () ،
فئة جديدة [] {foo.class} ،
معالج) ؛
F.DoAction () ؛
// 3. تطبيق الواجهة 2
Handler.SetTarget (New Fooimpl2 ()) ؛
f = (foo) proxy.newproxyinstance (foo.class.getClassloader () ،
فئة جديدة [] {foo.class} ،
معالج) ؛
F.DoAction () ؛
}
}
لأن لدي موهبة أدبية محدودة ، فإن معظم المحتوى هو رمز