Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SW203 Lab9

2,983 views

Published on

Lab9

Published in: Education
  • Be the first to comment

SW203 Lab9

  1. 1. Объект хандлагат програмчлалын хэл Java Хичээл : CS203 Улирал : 2010 хавар Бэлтгэсэн багш : Д.Энхжаргал Mongolia University of Science & Technology Лабораторийн ажил № 9 Reflection Оноо: 3
  2. 2. Reflection <ul><li>Даалгавар: </li></ul><ul><ul><li>Оюутан бүр өөрийн сонгосон сэдэвтээ тохируулан бодлогын даалгавраа өөрөө хийсвэрлэж ( өөрийн гэсэн нэг класс сонгож ) хожуу холболтыг хэрэгжүүлсэн жижиг хэмжээний програм бичих. </li></ul></ul><ul><li>Онолын хувд: </li></ul><ul><li>Эрт холболт (Early binding) нь компиляцын үед дуудагдах функцуудыг мэдэгдэж байхыг шаарддаг. Түүнийг заримдаа статик холболт (static binding) ч гэж нэрлэдэг. Эрт холболт нь компиляцын үед ямар функц дуудагдах нь мэдэгдэж байдаг учраас холболтыг компиляцын явцад (compile time) хийж өгдөг. </li></ul><ul><li>Хожуу холболт (late binding) : Java програм нь гишүүн функцуудыг биелэх үед нь динамик зохион байгуулалттайгаар дууддаг. Үүнийг хожуу холболт (late binding) гэнэ. Хожуу холболтыг динамик холболт (dynamic binding) ч гэж заримдаа нэрлэдэг. Хожуу холболтын үед компиляцын үед ямар функц дуудагдах нь тодорхойгүй байдаг учраас холболтыг биелэлтийн явцад (run- time) хийж өгдөг. </li></ul><ul><li>Шаардлага: </li></ul><ul><li>Бодлогын даалгавар нь бодит амьдралд нийцсэн байх. </li></ul><ul><li>Бүрэлдэхүүн класс </li></ul>
  3. 3. Класс/интерфейсийн тодорхойлогч public class Student {…} эсвэл public interface Cafe {…} Interface Cafe extends University { …} эсвэл public class Student extends Person { …} Interface Cafe extends University { …} эсвэл public class Student extends Person { …} print_method_or_constructor() гэсэн статик функцын тусламжтай байгуулагч функцуудын мэдээлэл харах print_field() гэсэн статик функцын тусламжтай гишүүн өгөгдлийн талаарх мэдээлэл харах print_method_or_constructor() гэсэн статик функцын тусламжтай гишүүн функцын талаарх мэдээлэл харах java.lang.reflect пакет дахь классыг импортлох Дэлгэрэнгүй харахыг хүссэн класс/интерфейсийнхээ нэрийг програмд 0-р аргумент болгон дамжуулах
  4. 4. Жишээ (Reflection) : Классын гишүүдтэй танилцах <ul><li>Энд ашиглагдсан функцууд </li></ul><ul><li>Class классын </li></ul><ul><li>isInterface(); - Тухайн object reference type нь интерфейс эсэхийг шалгах функц </li></ul><ul><li>getModifiers(); -Тухайн класс/интерфейсийн хандалтыг тодорхойлогчийг унших </li></ul><ul><li>getName(); -Тухайн класс/интерфейсийн нэрийг унших </li></ul><ul><li>getSuperclass(); - Тухайн класс/интерфейсийн эх классыг буцаах </li></ul><ul><li>getInterfaces(); - Тухайн класс/ интерфейстэй холбогдсон интерфейсүүдийг буцаах </li></ul><ul><li>getDeclaredConctructors(); - Тухайн классд тодорхойлогдсон байгуулагч функцуудыг буцаах </li></ul><ul><li>getDeclaredFileds(); - Тухайн классд тодорхойлогдсон гишүүн өгөгдлүүдийг буцаах </li></ul><ul><li>getDeclaredMethods(); - Тухайн классд тодорхойлогдсон гишүүн функцуудыг буцаах </li></ul>
  5. 5. Төрөл хувиргалт
  6. 6. <ul><li>Энд ашиглагдсан функцууд </li></ul><ul><li>Class классын </li></ul><ul><li>isArray(); - Тухайн object reference type нь массив эсэхийг шалгах функц </li></ul><ul><li>Field классын </li></ul><ul><li>getModifiers(); -Тухайн гишүүн өгөгдлийн хандалтыг тодорхойлогчийг буцаах </li></ul><ul><li>getType(); -Тухайн гишүүн өгөгдлийн төрлийг буцаах </li></ul><ul><li>getName(); - Тухайн гишүүн өгөгдлийн нэрийг буцаах </li></ul><ul><li>Method классын </li></ul><ul><li>getReturnType(); - Тухайн гишүүн функцын буцаах утгыг буцаах </li></ul><ul><li>getParameterTypes(); - Тухайн гишүүн функцын парамет - рүүдийн төрлүүдийг буцаах </li></ul><ul><li>getExceptionTypes(); - Тухайн гишүүн функцын хаях онцгой тохиолдлуудын төрлүүдийг буцаах </li></ul><ul><li>Constructor классын </li></ul><ul><li>getParameterTypes(); - Тухайн </li></ul><ul><li>байгуулагч функцын парамет - </li></ul><ul><li>рүүдийн төрлүүдийг буцаах </li></ul><ul><li>getExceptionTypes(); - Тухайн </li></ul><ul><li>байгуулагч функцын хаях онцгой </li></ul><ul><li>тохиолдлуудын төрлүүдийг </li></ul><ul><li>буцаах </li></ul>
  7. 7. Reflection of Student class ҮР ДҮН: ShowClass.java
  8. 8. Reflection of University interface ҮР ДҮН: ShowClass.java
  9. 9. Жишээ (Reflection) : Invoking method dynamically <ul><li>Тухайн классаас харгалзах гишүүн функцыг унших getMethod(methodname, parameters); </li></ul><ul><li>Тухайн гишүүн функцыг динамикаар холбож ажлуулах methodname.invoke(target, arguments); </li></ul>
  10. 10. Жишээ: Reflection <ul><li>Багш (Teacher) классыг авч үзъе. </li></ul><ul><li>Одоо түүний объектуудыг тодорхойлъё : </li></ul><ul><ul><li>Энэ тохиолдолд бид Сургууль (School) классыг сайтар мэдэх бөгөөд түүн рүү кодчилолын явцад хандаж чадна. </li></ul></ul><ul><ul><li>Хэрэв Сургууль (School) классд зарим өөрчлөлт орвол ( гишүүн функц нь өөрчлөгдөх эсвэл шинээр нэмэгдэнэ гэж үзвэл ) бид кодоо дахин бичих шаардлага гарна. </li></ul></ul>package csms.sw203.school; public class School { private String name; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String toString() { return name + &quot; at &quot; + address; } } School school = new School(); school.setName(&quot;KTMC&quot;); school.setAddress(&quot;Sansar, UB, Mongolia&quot;);
  11. 11. <ul><li>Reflection хэмээх ойлголтын тусламжтай бид тэдгээр асуудлыг хялбар аргаар шийдэж болно. </li></ul><ul><ul><li>Reflection нь биднийг танил бус классуудтайгаа ажиллах боломжийг бүрдүүлэх бөгөөд кодын өөрчлөлтийг төвөггүйхэн хийх боломжтой болно. </li></ul></ul>Жишээ: Reflection public class ReflectionTestClass1 { public static void main(String[] args) throws Exception { ReflectionTestClass1 test = new ReflectionTestClass1(); test.createSchool(); } private void createSchool() throws Exception { Properties prop = new Properties(); prop.load(this.getClass().getResourceAsStream(&quot;school.properties&quot;)); Object object = Class.forName(&quot;csms.sw203.school.School&quot;).newInstance(); Enumeration keys = prop.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key); String methodName = &quot;set&quot; + key.substring(0, 1).toUpperCase() + key.substring(1); Method method = object.getClass().getMethod(methodName, new Class[]{String.class}); method.invoke(object, new Object[]{value}); } System.out.println(object); } } String -ээс класс үүсгэх Шинэ объектыг динамикаар үүсгэх Гишүүн функцыг динамикаар тодорхойлох Функцыг динамикаар холбох
  12. 12. <ul><li>createSchool() фунцыг дэлгэрэнгүй авч үзье. </li></ul><ul><ul><li>Дээрх 2 мөр нь CLASSPATH –аас “school.properties” текст файлыг ачаалдаг. </li></ul></ul><ul><ul><li>Properties гэдэг нь Java класс юм. Түүнийг “properties” нэртэй текст файлд хадгалах бөгөөд дараах форматтай. </li></ul></ul><ul><ul><ul><li>name=value </li></ul></ul></ul><ul><ul><ul><li>Энэхүү Properties класс нь “names” болон “values” -ийг тодорхойлох функцээр хангагдсан. </li></ul></ul></ul><ul><ul><li>this.getClass().getResourceAsStream(&quot;school.properties&quot;) гэсэн мөрөнд тухайн идэвхитэй замаас School.properties файлын агуулгыг унших </li></ul></ul><ul><ul><li>Дээрх мөр нь reflection -той холбоотой 2 онцлогийг ашиглана. dynamic class loading ба dynamic instantiation . </li></ul></ul><ul><ul><ul><li>Class.forName(&quot;csms.sw203.school.School&quot;) мөр нь JVM -д “ csms.sw203.school ” нэртэй пакетаас &quot;School“ нэртэй классыг хайж олоод санах ойд ачааллах үүрэг өгнө. Үр дүнд нь динамкаар ачаалагдсан классын объектыг буцааана. </li></ul></ul></ul>Жишээ: Reflection Properties prop = new Properties(); prop.load(this.getClass().getResourceAsStream(&quot;school.properties&quot;)); Object object = Class.forName(&quot;csms.sw203.school.School&quot;).newInstance();
  13. 13. <ul><ul><li>Дээрх мөрөнд объектыг динамикаар үүсгэж байна. </li></ul></ul><ul><ul><ul><li>Бид Properties файлаас хүссэн утгаа хайж олохын тулд түлхүүр (key) ашиглах шаардлагатай. Энэ түлхүүр нь Properties файл дахь name хэсэг юм. </li></ul></ul></ul>Жишээ: Reflection Object object = Class.forName(&quot;csms.sw203.school.School&quot;).newInstance(); Enumeration keys = prop.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key); ... ... }
  14. 14. <ul><ul><li>Дээр schoool.properties файлын агуулгыг үзүүлсэн байна . </li></ul></ul><ul><ul><li>property бүрт харгалзах setter функцыг School классд тодорхойлсон. Жишээ нь. </li></ul></ul><ul><ul><li>name  setName() </li></ul></ul><ul><ul><li>address  setAddress() </li></ul></ul><ul><ul><li>Давталтын </li></ul></ul><ul><ul><ul><li>3 мөрөнд property key -д харгалзах функцын нэрийг гаргаж авч байна </li></ul></ul></ul><ul><ul><ul><li>4 мөрөнд тухайн классаас тухайн нэрт харгалзах функцын нэрийг динамикаар тодорхойлж байна </li></ul></ul></ul><ul><ul><ul><li>5 мөрөнд уг функцыг динамикаар холбож ажлуулж байна </li></ul></ul></ul>Жишээ: Reflection name=KTMC address=Sansar, Ulaanbaator, Mongolian Enumeration keys = prop.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key); String methodName = &quot;set&quot; + key.substring(0, 1).toUpperCase() + key.substring(1); Method method = object.getClass().getMethod(methodName, new Class[]{String.class}); method.invoke(object, new Object[]{value}); }
  15. 15. <ul><li>Давталт дахь сүүлчийн 2 мөрөнд анхаарлаа хандуулъя </li></ul><ul><ul><li>Функц гэдэгт тухайн функцын нэрээс гадна параметрүүдийг хамтад нь авч үздэг. </li></ul></ul><ul><ul><ul><li>Хэдийгээр функцын нэр нь адил боловч параметрийн төрлөөрөө ялгаатай бол харгалзах функцыг цааш хайх шаардлага гарна. </li></ul></ul></ul>Жишээ: Reflection Enumeration keys = prop.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); String value = prop.getProperty(key); String methodName = &quot;set&quot; + key.substring(0, 1).toUpperCase() + key.substring(1); Method method = object.getClass().getMethod(methodName, new Class[]{String.class}); method.invoke(object, new Object[]{value}); }

×