"Halo, Amigo."

"Hallo, Riska."

"Dina iki aku bakal nerangake topik anyar lan menarik banget kanggo sampeyan: proxy dinamis" .

"Jawa duwe sawetara cara kanggo ngganti fungsi kelas tartamtu ..."

"Cara pisanan yaiku warisan."

"Cara paling gampang kanggo ngganti prilaku kelas iku kanggo nggawe kelas anyar sing olèh warisan kelas asli (basis), lan ngganti cara sawijining. Banjur, tinimbang nggunakake kelas asli, sampeyan nggunakake kelas asale. Contone: "

Reader reader = new UserCustomReader();

"Cara kapindho yaiku nggunakake kelas pambungkus."

" BufferedReader minangka conto saka jinis kelas iki. Pisanan, iku warisan Reader . Ing tembung liyane, bisa digunakake tinimbang Reader. Kapindho, pangalihan kabeh telpon menyang obyek Reader asli , sing kudu diterusake menyang konstruktor obyek BufferedReader. . Tuladhane:"

Reader readerOriginal = new UserCustomReader();
Reader reader = new BufferedReader(readerOriginal);

"Cara katelu yaiku nggawe proxy dinamis (Proxy)."

"Ana kelas khusus ing Jawa (java.lang.reflect.Proxy) sing bener ngidini sampeyan mbangun obyek sajrone eksekusi program (dinamis), tanpa nggawe kelas sing kapisah."

"Iki gampang banget:"

Reader reader = (Reader)Proxy.newProxyInstance();

"Iku wis ana sing anyar kanggo aku!"

"Nanging mesthi wae, kita ora butuh obyek sing ora ana metode. Kita butuh obyek kasebut duwe metode, lan kita kudu nindakake apa sing dikarepake. Jawa nggunakake antarmuka khusus kanggo iki sing diarani InvocationHandler, sing bisa nyegat kabeh panggilan metode . digandhengake karo obyek proxy. Objek proxy mung bisa digawe nggunakake antarmuka."

" Invoke - minangka jeneng standar kanggo metode utawa kelas sing tugas utamane mung nelpon sawetara metode."

" Handler - iku jeneng standar kanggo kelas sing nangani sawetara acara. Contone, kelas sing nangani klik mouse bakal disebut MouseClickHandler, etc."

"Antarmuka InvocationHandler nduweni cara invoke siji, sing kabeh telpon menyang obyek proxy diarahake . Contone:"

Kode
Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler());
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  System.out.println("yes!");
  return null;
 }
}

"Nalika nelpon maca . nutup () cara, cara invoke bakal disebut, lan layar bakal nampilake 'ya!'"

"Dadi, kita ngumumake CustomInvocationHandler, kelas, lan ngleksanakake antarmuka InvocationHandler lan metode invoke . Nalika metode invoke diarani, nampilake 'ya!'. Banjur kita nggawe obyek CustomInvocationHandler , lan liwati menyang metode newProxyInstance nalika nggawe obyek proxy."

"Ya, kabeh iku bener."

"Iki minangka alat sing kuat banget. Biasane, proxy iki digawe kanggo simulasi obyek ing program sing mlaku sacara fisik ing komputer liyane.  Utawa kanggo ngontrol akses."

"Sampeyan bisa mriksa ijin pangguna saiki, nangani kesalahan, kesalahan log, lan liya-liyane ing metode iki."

"Iki conto ing ngendi metode invoke uga nelpon metode obyek asli:"

Kode
Reader original = new UserCustomReader();

Reader reader = (Reader)Proxy.newProxyInstance(new CustomInvocationHandler(original));
reader.close();
class CustomInvocationHandler implements InvocationHandler
{
 private Reader readerOriginal;

 CustomInvocationHandler(Reader readerOriginal)
 {
  this.readerOriginal = readerOriginal;
 }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  if (method.getName().equals("close"))
  {
   System.out.println("Reader closed!");
  }

  // This calls the readerOriginal object's close method.
  // The method's name and a description of its parameters are stored in the method variable.
  return method.invoke(readerOriginal, args);
 }
}

"Conto iki duwe rong fitur khusus."

"Kaping pisanan, obyek Reader «asli» diterusake menyang konstruktor, lan referensi kasebut disimpen ing CustomInvocationHandler .

"Kapindho, kita nelpon cara sing padha maneh ing metode invoke, nanging ing obyek «asli» wektu iki.

"Ah. Ing tembung liyane, baris pungkasan iki nelpon cara sing padha, nanging ing obyek asli: "

return method.invoke(readerOriginal, args);

"Ya wis."

"Aku ora bakal ngomong sing super ketok, nanging isih dingerteni. Utawa misale jek."

"Great. Banjur siji liyane. Ing cara newProxyInstance, sampeyan kudu ngliwati informasi housekeeping sethitik liyane kanggo nggawe obyek proxy. Nanging amarga kita ora nggawe obyek proxy monstrous, informasi iki gampang dipikolehi saka kelas asli dhewe. "

"Iki conto liyane:"

Kode
Reader original = new UserCustomReader();

ClassLoader classLoader = original.getClass().getClassLoader();
Class<?>[] interfaces = original.getClass().getInterfaces();
CustomInvocationHandler invocationHandler = new CustomInvocationHandler(original);

Reader reader = (Reader)Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
class CustomInvocationHandler implements InvocationHandler
{
 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 {
  return null;
 }
}

"Ah. ClassLoader lan dhaptar antarmuka. Iki soko saka Reflection, apa ora?"

"Ya wis."

"Inggih. Inggih, aku bisa nggawe primitif, super prasaja obyek proxy yen aku tau perlu siji."

"Banjur mlebu karo Diego."