Java Konsidero, introspekto kaj Customization – Simpligita

Java Reflection

Java Konsidero

Superrigardo: En ĉi tiu dokumento ni parolos pri konsidero, introspekto kaj customization en Java faboj. Ĉi tiuj estas la gravaj flankoj de Java programara lingvo uzanta kiun ni atingas la viglecon ĉe runtime.







Enkonduko:
konsidero kaj introspekto estas du gravaj ĉefaĵoj de Java programaro. Ĉi tiuj estis inkluzivita en la JDK 1.1 Permesi la ellaborantojn al dynamically produktas kaj re-uzi la kodon. Ĉi tiuj ĉefaĵoj permesas objekton eltrovi ĝian propran informon kaj pri aliaj objektoj ĉe runtime. Konsidero permesas la ellaboranton krei objektojn kiu povas:

  • Konstrui novajn okazojn de klasoj kaj iliaj aroj.
  • Aliri la kampojn de objektoj aŭ klasoj kaj modifi ilin se postulita.
  • Alvoki metodojn sur objektoj aŭ klasoj.
  • Aliri la elementojn de la aroj kaj modifi ilin se postulita.

Unu povas argumenti ke ĉiuj de la supraj servoj estas haveblaj en ajna objekto oriented programara lingvo. Tamen en java kun la helpo de konsidero ni povas atingi ĉi tiujn sen scianta la nomon de la klaso aŭ objekto sur kiu ĉi tiuj agoj estus elfarita ĉe kompili tempon la stato kaj konduto de la klaso aŭ objekto estas determinita ĉe runtime. La sekvanta bildo montras la rolon de konsidero en Java programaro:

Java Reflection

Java Konsidero

Cifero 1: Konsidero en Java programaro

Introspekto en java estas uzita en la kunteksto de Java faboj kiu difinas la eran modelon de java. Introspekta ĉefaĵo ebligas java fabo akiri la nemoveblaĵojn, metodoj kaj eventoj de aliaj faboj ĉe runtime. Tio ĉi helpas la ellaborantojn desegni kaj evoluigi iliajn fabojn sen scianta la detalojn de aliaj faboj.

introspekto kaj konsidero estas interilatita. Konsidero estas malalta nivela ĉefaĵo kiu permesas nian kodon kontroli la internals de aliaj klasoj aŭ objektoj ĉe runtime. Introspekto estas bazita sur ĉi tiu ĉefaĵo kaj provizas pli oportuna fasado kontroli la fabojn ĉe runtime. Fakte introspekta ĉefaĵo uzas la malaltan nivelan konsideron kontroli la objektojn internaj ecoj.

La Konsidera API:
Java 1.1 Enkondukis la konsideran kadron. Konsidero estas ofte uzita en programoj kiu postulas kontrolanta aŭ ĝisdatiganta la runtime konduto de la aplika kurado en la Java virtuala maŝino. Tio ĉi estas relative altnivela ĉefaĵo kaj devus esti uzita kun plejebla prizorgo. Kun ĉi tiu fakto en menso, Ni povas diri tiun konsideron estas potenca tekniko kaj ebligi aplikojn elfari operaciojn kiu alie estus neebla. Lasi nin rigardo en la sekvanta koda bazo kiu montras la uzadon de konsidero:

Enlistiganta 1: Ekzempla klaso efektiviganta konsideron

[Kodo]

Pako Com.Hejme.Reflektas;

Importaĵo Java.Lang.Reflektas.Aro;

Importaĵo Java.Lang.Reflektas.Kampo;

Importaĵo Com.Hejme.VO.EMPVO;

Publika Klaso DemoReflect {

Publika Senmova Ŝnura rubejo(Kontraŭargumenti obj, Int CallCount) {

CallCount ;

StringBuffer klapetoj = Nova StringBuffer();

Por (Int K = 0; K < CallCount; K ) {

Klapetoj.Almetas(“\T”);

}

StringBuffer bufro = Nova StringBuffer();

Klaso Clazz = obj.GetClass();

Se (Clazz.IsArray()) {

Bufro.Almetas(“\N”);

Bufro.Almetas(Klapetoj.ToString());

Bufro.Almetas(“[“);

Por (Int I = 0; I < Aro.GetLength(Obj); I ) {

Se (I < 0)

Bufro.Almetas(“,”);

Objekta valoro = Aro.Akiri(Obj, I);

Se (Valoro.GetClass().IsPrimitive() ||

Valoro.GetClass() == Java.Lang.Longe.Klaso ||

Valoro.GetClass() == Java.Lang.Ŝnuro.Klaso ||

Valoro.GetClass() == Java.Lang.Integralo.Klaso ||

Valoro.GetClass() == Java.Lang.Boolea.Klaso

) {

Bufro.Almetas(Valoro);

} Alia {

Bufro.Almetas(Rubejo(Valoro, CallCount));

}

}

Bufro.Almetas(Klapetoj.ToString());

Bufro.Almetas(“]\N”);

} Alia {

Bufro.Almetas(“\N”);

Bufro.Almetas(Klapetoj.ToString());

Bufro.Almetas(“{\N”);

Dum (Clazz != Null) {

Kampo[] Kampoj = clazz.GetDeclaredFields();

Por (Int I = 0; I < Kampoj.Longeco; I ) {

Bufro.Almetas(Klapetoj.ToString());

Kampoj[I].SetAccessible(Vera);

Bufro.Almetas(Kampoj[I].GetName());

Bufro.Almetas(“=”);

Provo {

Kontraŭargumenti objVal = kampoj[I].Akiri(Obj);

Se (ObjVal != Null) {

Se (ObjVal.GetClass().IsPrimitive() ||

ObjVal.GetClass() == Java.Lang.Longe.Klaso ||

ObjVal.GetClass() == Java.Lang.Ŝnuro.Klaso ||

ObjVal.GetClass() == Java.Lang.Integralo.Klaso ||

ObjVal.GetClass() == Java.Lang.Boolea.Klaso

) {

Bufro.Almetas(ObjVal);

} Alia {

Bufro.Almetas(Rubejo(ObjVal, CallCount));

}

}

} Kaptaĵo (IllegalAccessException e) {

Bufro.Almetas(E.GetMessage());

}

Bufro.Almetas(“\N”);

}

Clazz = clazz.GetSuperclass();

}

Bufro.Almetas(Klapetoj.ToString());

Bufro.Almetas(“}\N”);

}

Reveno Bufro.ToString();

}

Publika Senmova Malplena Ĉefa(Ŝnuro[] Args) {

EMPVO emp = Nova EMPVO();

Emp.SetEmpNo(1);

Emp.SetEmpName(“John”);

Sistemo.Ekstere.Println(DemoReflect.Rubejo(Emp, 5));

}

}

[/Kodo]

Enlistiganta 2: La EMPa VOa klaso

[Kodo]

Pako Com.Hejme.VO;

Publika Klaso EMPVO {

Privata Int EmpNo;

Privata Laĉi empName;

/**

* @Reveno La empNo

*/

Publika Int GetEmpNo() {

Reveno EmpNo;

}

/**

* @Param EmpNo la empNo fiksi

*/

Publika Malplena SetEmpNo(Int EmpNo) {

Tio ĉi.EmpNo = empNo;

}

/**

* @Reveno La empName

*/

Publika Laĉi getEmpName() {

Reveno EmpName;

}

/**

* @Param EmpName la empName fiksi

*/

Publika Malplena SetEmpName(Laĉi empName) {

Tio ĉi.EmpName = empName;

}

}

[/Kodo]

La konsidera API konsistas de la sekvantaj klasoj de la java.lang kaj java.Lang.Reflektas pakon:

  • Klaso
  • Aro
  • Constructor
  • Kampo
  • Membro
  • Metodo
  • Modifilo








Limoj de Konsidero:
Konsidero estas potenca kaj devus esti uzita kun plejebla prizorgo. Ĝi devus esti uzita nur en la situacio kiam estas ne alia elekto lasita kiel ĝi havas la sekvantajn limojn:

  • Elfaro supre: Pro tio ke konsidero uzas la tipojn kiu estas dynamically solvita, Kelkaj de la JVM optimizations ne estas elfarita. Rezulte, Reflektaj operacioj estas pli malrapidaj ol la ne reflekta ones.
  • Sekurecaj restriktoj: Konsidero postulas runtime permeso kiu ne povas esti havebla dum kuranta ene de sekureca manaĝero. Ekz. Apleto kiu kuras sub restriktita sekurecan kuntekston.
  • Malkovro de internals: Pro tio ke konsidero permesas la kodon elfari operaciojn kiu volus kontraŭleĝan por ne reflekta kodo ekz. aliranta la privatajn kampojn kaj metodojn, Uzo de konsidero povas rezulti en kelkaj nedezirataj flankaj efikoj.

La Introspekta API:
Introspekto estas aŭtomata procezo en kiu la desegno de la fabo skemoj estas analizita eltiri la nemoveblaĵojn de la fabo, Eventoj, Kaj metodoj. Introspekto havas kelkajn grandajn avantaĝojn kiel nesufiĉe:

  • Re-afabligo.

La introspekta API konsistas de la sekvantaj klasoj de la java. Faba pako:

  • BeanDescriptor
  • BeanInfo
  • FeatureDescriptor
  • EventSetDescriptor
  • MethodDescriptor
  • PropertyDescriptor
  • IndexedPropertyDescriptor
  • Introspector
  • SimpleBeanInfo

ambaŭ konsidero kaj introspekto estas gravaj flankoj de Java programaro kaj devus esti uzita nur kiam absolute necesa. La sekvanta koda ereto montras kombinaĵon de konsidero kaj introspekto:

Enlistiganta 3: Ekzempla kodo montranta introspekton

[Kodo]

Pako Com.Hejme.Reflektas;

Importaĵo Java.Lang.Reflektas.Metodo;

Publika Klaso DemoIntroSpect {

Publika Senmova Malplena Ĉefa(Ŝnuro[] Args) {

Provo {

Klaso Clazz = Klaso.ForName(“Com.Hejme.VO.EMPVO”);

Metodo [] Metodoj = clazz.GetMethods();

Por (Metoda metodo : Metodoj) {

Sistemo.Ekstere.Println(“Metoda Nomo = ” +Metodo.GetName());

}

} Kaptaĵo (ClassNotFoundException e) {

// TODO Aŭtomobilo-produktita kaptaĵan blokon

E.PrintStackTrace();

}

}

}

[/Kodo]

Customization:
Customization provizas la ĉefaĵon vide modifi la java fabaj nemoveblaĵoj kiel por la postulo de la situacio. Unufoje la faboj estas desegnita por ke konsidero kaj introspekto povas okazi, Ni devus elprovi nian kodon kontroli ĉu ĉi tiuj prezentas efektive okazi aŭ ne. Ekz. Lasi nin konsideri horloĝan fabon. La uzanto devus havi la potencon personigi ĝin al diĝita aŭ analogaĵo bazita sur iu nemoveblaĵo. Kelkaj vidaj konstruistoj ekz. la netbeans IDEa uzo nemoveblaĵaj folioj por personigi la fabojn.








Resuma:

Konsidero, introspekto kaj customization ĉiuj tri estas dependa sur ĉiu alia. Konkludi ĉi tiun temon lasis nin resumi kion ni diskutis sur en la sekvantaj kugloj kiel nesufiĉe:

  • Konsidero estis enkondukita en Java 1.1.
  • Konsidero permesas la ellaboranton krei objektojn ĉe runtime kiu ujo :
    • Konstrui novajn okazojn de klasoj kaj iliaj aroj.
    • Aliri la kampojn de objektoj aŭ klasoj kaj modifi ilin se postulita.
    • Alvoki metodojn sur objektoj aŭ klasoj.
    • Aliri la elementojn de la aroj kaj modifi ilin se postulita.
  • konsidero kaj Introspekto havas kelkajn malavantaĝojn kiel nesufiĉe :
    • Uzanta ĉi tiujn ĉefaĵojn degeneras la elfaron de la programo.
    • La kodo fariĝas pli malferma kiel la internals estas malkovrita.
    • Eraroj en metoda alvokado estas eltrovita ĉe kura tempo. En normala ekzercado ĉi tiuj estas kaptita de la compiler ĉe kompili tempon.
    • La kodo fariĝas pli komplika kaj ĝi fariĝas malfacila daŭrigi ĝin.
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share