على الرغم من أننا نعتقد عادةً أنه من الممكن الوصول إلى الحقول الخاصة والأساليب الخاصة للفئات الأخرى من خلال آلية الانعكاس الخاصة بـ JAVA، إلا أن الأمر ليس بهذه الصعوبة.
ملاحظة: لن يعمل هذا الرمز إلا إذا قمت بتشغيله في برنامج JAVA منفصل، مثل إجراء بعض اختبارات الوحدات أو برنامج عادي. إذا حاولت استخدام هذه الطريقة داخل تطبيق JAVA، فستحتاج إلى تعديل SecurityManager قليلاً. ومع ذلك، نظرًا لأنك لا تحتاج في كثير من الأحيان إلى التعامل معها، فلن أخوض في التفاصيل هنا.
فيما يلي قائمة بهذا المحتوى:
1. الوصول إلى الحقول الخاصة.
2. الوصول إلى الطرق الخاصة.
الوصول إلى الحقول الخاصة:
للوصول إلى الحقول الخاصة، تحتاج إلى استدعاء الأسلوب Class.getDeclaredField(String name) أو Class.getDeclaredFields(). تقوم الطرق Class.getField(String name) وClass.getFields() بإرجاع الحقول المشتركة فقط، لذلك ليس لها أي تأثير. فيما يلي مثال لفئة تحتوي على حقول خاصة، ويوجد أسفل الفئة رمز يصل إلى الحقول الخاصة من خلال الانعكاس.
انسخ رمز الكود كما يلي:
فئة عامة كائن خاص {
سلسلة خاصة publicString = null; // تم الإعلان عنه كحقل خاص
كائن خاص عام (سلسلة سلسلة خاصة) {
this.privateString = PrivateString;
}
}
انسخ رمز الكود كما يلي:
PrivateObject PrivateObject = new PrivateObject("القيمة الخاصة");// إنشاء مثيل للكائن
الحقل publicStringField = PrivateObject.class.
getDeclaredField("privateString");
PrivateStringField.setAccessible(true);//السماح بالوصول إلى الحقول الخاصة
String fieldValue = (String) publicStringField.get(privateObject);// احصل على قيمة الحقل الخاص
System.out.println("fieldValue = " + fieldValue);
سيقوم هذا الرمز بطباعة النص "fieldValue = The Private Value"، والذي يصادف أنه قيمة الحقل الخاص سلسلة خاصة للكائن PrivateObject.
لاحظ أننا استخدمنا الطريقة PrivateObject.class.getDeclaredfield("privateString"). هذا الاستدعاء لهذه الطريقة هو الذي يُرجع الحقل الخاص. تقوم هذه الطريقة بإرجاع الحقول المستندة إلى الفئة المحددة فقط، ولن تقوم بإرجاع الحقول المعلنة بواسطة الفئة الأصلية.
انظر أيضًا بعناية إلى البيانات المكتوبة بالخط العريض. من خلال استدعاء Field.setAccessible(true)، يمكنك إيقاف تشغيل التحقق من الوصول لمثيل الحقل المحدد هذا، وهو أمر فعال فقط للانعكاس. يمكنك الآن الوصول إليه، سواء كان خاصًا أو محميًا أو افتراضيًا، حتى لو لم يكن المتصل ضمن هذا النطاق. لا يزال يتعذر عليك الوصول إلى الحقل عبر الطرق العادية لأن المترجم لا يسمح بذلك.
الوصول إلى الأساليب الخاصة <BR>للوصول إلى أسلوب خاص، تحتاج إلى استدعاء الأسلوب Class.getDeclaredMethod(String name,Class[] ParameterTypes) أو الأسلوب Class.getDeclaredMethods(). تقوم الطرق Class.getMethod(String name,Class[] ParameterTypes) وClass.getMethods() بإرجاع الأساليب العامة فقط، لذلك لن تلعب أي دور. فيما يلي مثال بسيط لفئة ذات أساليب خاصة يوجد أسفل الفصل الكود الذي يصل إلى الأساليب الخاصة من خلال الانعكاس.
انسخ رمز الكود كما يلي:
فئة عامة كائن خاص {
سلسلة خاصة publicString = null;
كائن خاص عام (سلسلة سلسلة خاصة) {
this.privateString = PrivateString;
}
سلسلة خاصة getPrivateString () {// طريقة خاصة
إرجاع this.privateString;
}
}
انسخ رمز الكود كما يلي:
PrivateObject PrivateObject = new PrivateObject("القيمة الخاصة");
طريقة PrivateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
PrivateStringMethod.setAccessible(true);
قيمة إرجاع السلسلة = (سلسلة)
PrivateStringMethod.invoc(privateObject, null);
System.out.println("returnValue =" + returnValue);
يطبع مثال التعليمات البرمجية هذا النص "returnValue = The Private Value"، والذي يصادف أنه القيمة المرجعة للأسلوب الخاص.