SW203 Lab9

2,920 views

Published on

Lab9

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,920
On SlideShare
0
From Embeds
0
Number of Embeds
1,270
Actions
Shares
0
Downloads
87
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Хэрэв програмд 0-р аггументаар интерфейсийн нэр дамжигдсан бол: Тухайн интерфейсийн нэрийг хандалт тодорхойлогчийнх нь хамт хэвлэнэ. Харин классын нэр дамжигдсан бол классын нэрийг хандалт тодорхойлогчийн хамт хэвлэхийн зэрэгцээ түүний эх классыг нь тодорхойлно. Хэрэв програмд 0-р аргументаар Интерфейсийн нэрийг дамжуулсан бол тэрээр өөр интерфейстай удамшил - extends Классын нэрийг дамжуулсан бол тэрээр интерфейсийг хэрэгжүүлэх- implements гэсэн холбоосоор тус тус холбогдоно. public class Student extends Person implements University{ protected String id; int age; public Student(){ } public void setInfo(String i, String n, int a){ id=i; name=n; age=a; } public void display() {} }
  • 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}); }

    ×