1. ما هو الانعكاس؟
يحتوي الفصل على مكونات متعددة ، مثل متغيرات الأعضاء ، والأساليب ، والمصمم ، إلخ.
الانعكاس هو تحميل الفصل وتشريح المكونات المختلفة للفئة.
2. تحميل الفصل
هناك فئة فئة في Java تمثل رمز Bytecode لفئة معينة.
نظرًا لأن الفصل الدراسي يمثل الرمز الباقري لفئة معينة ، يجب أن يوفر تحميل فئة معينة.
طريقة bytecode: forname ().
في الذاكرة والتغليف باستخدام كائنات الفئة.
طريقتان أخريان للحصول على كائنات الفصل:
اسم الفصل
Object.getClass ()
إنشاء فئة شخص بسيط أولاً
نسخة الكود كما يلي:
الطبقة العامة تعكس DESTEDEMO {
الفراغ الثابت العام (سلسلة args []) يلقي الاستثناء
{// 1.
class clazz = class.forname ("dsa.person") ؛
// 2.
class clazz1 = new person (). getClass () ؛
// 3.
classClazz2 = person.class ؛
}
}
3. طريقة بناء الانعكاس
في فئة الشخص:
نسخة الكود كما يلي:
/**
*طريقة البناء
*/
PublicPerson () {
system.out.println ("null") ؛
}
PublicPerson (StringName) {
System.out.println (name) ؛
}
PublicPerson (StringName ، intpwd) {
System.out.println (name+"+"+pwd) ؛
}
PrivatePerson (قائمة قائمة) {
System.out.println ("List") ؛
}
في فئة الاختبار:
نسخة الكود كما يلي:
// Reflection Publicperson ()
@امتحان
publicvoidtest1 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
constructorcr = clazz.getConstructor (null) ؛ // احصل على كائن المنشئ
personp = (شخص) Cr.NewInstance (NULL) ؛ // إنشاء الكائن من خلال المُنشئ
//system.out.println(p.name) ؛
}
// Reflection PublicPerson (StringName)
@امتحان
publicvoidtest2 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
constructorcr = clazz.getConstructor (string.class) ؛
personp = (شخص) cr.newinstance ("haha") ؛
system.out.println (p.name) ؛
}
// Reflection PublicPerson (StringName ، IntPWD)
@امتحان
publicvoidtest3 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
constructorcr = clazz.getConstructor (string.class ، int.class) ؛
personp = (شخص) cr.newinstance ("haha" ، 1) ؛
//system.out.println(p.name) ؛
}
// Reflection PublicPerson (قائمة قائمة)
@امتحان
publicvoidtest4 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
constructorcr = clazz.getDeclaredConstructor (list.class) ؛
Cr.SetAccible (صحيح) ؛ // كسر القوة الغاشمة
personp = (شخص) cr.newinstance (newArrayList ()) ؛
system.out.println (p.name) ؛
}
// طريقة أخرى لإنشاء الكائنات تنطبق فقط على بناء الأساليب بدون معلمات
@امتحان
publicvoidtest5 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
personp = (شخص) clazz.newinstance () ؛
system.out.println (p.name) ؛
}
عندما تكون طريقة البناء خاصة ، سنقوم بتشجيع القوة! ! !
4. الطرق التقليدية للتفكير
في فئة الشخص:
نسخة الكود كما يلي:
/**
*طريقة
*/
publicvoidjf ()
{
}
publicvoidjf (StringName ، intpwd)
{
}
PublicClass [] JF (StringName ، Int [] PWD)
{
returnnewclass [] {string.class ، int.class} ؛
}
privatevoidjf (inputStreamin)
{
System.out.println (in) ؛
}
publicstaticvoidjf (intnum)
{
System.out.println (num) ؛
}
PublicStaticVoidMain (StringArgs [])
{
System.out.println ("Main !!!") ؛
}
في فئة الاختبار:
نسخة الكود كما يلي:
/**
*طريقة عاكسة
*
*@Authortanlvxu
*
*/
PublicClassDemo2 {
// طريقة فئة الانعكاس: publicvoidjf ()
@امتحان
publicvoidtest1 () throwsexception {
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
MotherMethod = clazz.getMethod ("jf" ، null) ؛
method.invoke (p ، null) ؛
}
// طريقة فئة الانعكاس: publicvoidjf (StringName ، IntPWD)
@امتحان
publicvoidtest2 () throwsexception {
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
methodMethod = clazz.getMethod ("jf" ، string.class ، int.class) ؛
method.invoke (p ، "DSA" ، 30) ؛
}
// طريقة فئة الانعكاس: PublicClass [] JF (StringName ، int [] PWD)
@امتحان
publicvoidtest3 () throwsexception {
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
methodMethod = clazz.getMethod ("jf" ، string.class ، int []. class) ؛
classcs [] = (class []) method.invoke (p ، "aads" ، newint [] {1،2،3}) ؛
System.out.println (CS [0]) ؛
}
// طريقة فئة الانعكاس: privatevoidjf (inputStreamin)
@امتحان
publicvoidtest4 () throwsexception {
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
methodMethod = clazz.getDeclaredMethod ("JF" ، inputStream.class) ؛
method.setAccible (true) ؛
method.invoke (p ، newFileInputStream ("d: //qqclient.txt")) ؛
}
// طريقة فئة الانعكاس: publicstaticvoidjf (intnum)
@امتحان
publicvoidtest5 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
methodMethod = clazz.getMethod ("jf" ، int.class) ؛
method.invoke (null ، 30) ؛
}
// طريقة فئة الانعكاس: publicstaticvoidm (intnum)
@امتحان
publicvoidtest6 () throwsexception {
classClazz = class.forname ("rflectordemo.person") ؛
methodMethod = clazz.getMethod ("main" ، string []. class) ؛
//method.invoke(null ،(OBject)newstring Budap-10/isedsids،"das "}) ؛
method.invoke (null ، newObject [] {newstring [] {"ds" ، "das"}}) ؛
}
5. حقول الانعكاس
في فئة الشخص:
نسخة الكود كما يلي:
/**
*مجال
*/
publicstringName = "SWR" ؛
privelIntPassword = 45 ؛
خصوصيات = 35 ؛
في فئة الاختبار:
كود جافا
/**
*حقول الطبقة العاكسة
*@Authortanlvxu
*
*/
PublicClassDemo3 {
/**
*الانعكاس مجال publicstringName = "SWR" ؛
*@throwsexception
*/
@امتحان
publicvoidtest1 () throwsexception
{
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
fieldf = clazz.getfield ("name") ؛
// احصل على قيمة الحقل
ObjectValue = f.get (p) ؛
// احصل على نوع الحقل
classtype = f.gettype () ؛
if (type.equals (string.class)) {
StringName = (String) f.get (p) ؛
System.out.println (name) ؛
}
// اضبط قيمة الحقل
f.set (p ، "dfafa") ؛
system.out.println (p.name) ؛
}
/**
*حقل الانعكاس الخاص بمساريس.
*@throwsexception
*/
@امتحان
publicvoidtest2 () throwsexception
{
personp = newPerson () ؛
classClazz = class.forname ("rflectordemo.person") ؛
fieldf = clazz.getDeclaredField ("كلمة المرور") ؛
F.SetAccessible (صحيح) ؛
F.Set (P ، 36) ؛
system.out.println (f.get (p)) ؛
}
/**
*انعكاس مجال الخصوصية = 35 ؛
*@throwsexception
*/
@امتحان
publicvoidtest3 () throwsexception
{
classClazz = class.forname ("rflectordemo.person") ؛
fieldf = clazz.getDeclaredField ("Age") ؛
F.SetAccessible (صحيح) ؛
F.Set (NULL ، 24) ؛
system.out.println (f.get (null)) ؛
}
في الواقع ، بغض النظر عن طريقة بناء الانعكاس أو الحقول ، يمكننا أن نتعلم منها واحدة تلو الأخرى!