• Save
Cs203 lecture 14  reflection
Upcoming SlideShare
Loading in...5
×
 

Cs203 lecture 14 reflection

on

  • 2,335 views

reflection

reflection

Statistics

Views

Total Views
2,335
Views on SlideShare
2,075
Embed Views
260

Actions

Likes
2
Downloads
0
Comments
0

4 Embeds 260

http://cs203.blogspot.com 239
http://www.cs203.blogspot.com 10
http://www.slideshare.net 7
http://cs203.cdeq.mn 4

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Cs203 lecture 14  reflection Cs203 lecture 14 reflection Presentation Transcript

  • Объект хандлагат програмчлалын хэл Java
    Хичээл: CS203
    Багш:Д.Энхжаргал
    Mongolia University of Science & Technology
    Reflection
  • Polymorphism жишээ
    • 49,52,55 мөрөнд эх классын заагчаар хүү классын объектыг заалгасан байна.
    • 50,53,56-д тодорхойлсон card.greeting() мөр нь хожуу холболт үүсгэнэ. Учир нь компиляцын явцад аль объектын greeting() Функц дуудагдах нь тодорхойгүй байна.
  • Ойлголт сэргээх нь
    Ихэнхи програмчлалын хэл нь эрт холболт буюу статик холболтыгдэмждэг. Java хэл нь эрт ба хожуу холболтыг хоёуланг нь ашигладаг.
    Эрт холболт (Early binding) нь компиляцын үед дуудагдах функцуудыг мэдэгдэж байхыг шаарддаг. Түүнийг заримдаа статик холболт (static binding) ч гэж нэрлэдэг. Эрт холболт нь компиляцын үед ямар функц дуудагдах нь мэдэгдэж байдаг учраас холболтыг компиляцын явцад (compile time) хийж өгдөг.
    Хожуу холболт (late binding) : Java програм нь гишүүн функцуудыг биелэх үед нь динамик зохион байгуулалттайгаар дууддаг. Үүнийг хожуу холболт (late binding) гэнэ. Хожуу холболтыг динамик холболт (dynamic binding) ч гэж заримдаа нэрлэдэг. Хожуу холболтын үед компиляцын үед ямар функц дуудагдах нь тодорхойгүй байдаг учраас холболтыг биелэлтийн явцад (run- time) хийж өгдөг.
    Давуу болон дутагдалтай талууд: Эрт холболтыг хэрэгжүүлсэнээр хэрэгтэй функцууд бүгд санах ойд ачааллагдаж ажилладаг учраас санах ойг их зарцуулах дутагдалтай талтай ч хурдан ажиллах давуу талтай. Харин хожуу холболт нь тухайн үед хэрэг болсон функцээ л санах ойд ачааллан ажлуулах учраас санах ойг илүү хэмнэлттэй ашиглах боловч ажиллах хурд харьцангуй муу байж болох юм.
  • Object класс
    Асуулт: Энд алдаа заах уу?
    Хариулт: Алдаа заахгүй.
    Адилхан
  • Object класс
    Object класс нь Java хэлний бүх классуудын өвөг эцэг класс юм. Бид ямар нэг класс тодорхойлохдоо extends түлхүүр үг ашиглан ямар нэг классаас удамшуулсан гэсэн бичиглэлийг хийж өгсөн өгөөгүй байсан ч тухайн класс нь Object классаас далдуур удамшиж байдаг. Иймд аливаа классд Object классын гишүүн функцууд удамшдаг. Тухайлбал:
    Thread-тэй ажилдаг wait(), notify(), notifyAll()-ээс гадна equals(), toString() функцуудыг нэрлэж болно.
    Object классын toString() функц нь тухайн объектын классын нэрийг хэвлэх үүрэгтэй нилээд түгээмэл ашиглагддаг функц бөгөөд Java-ийн ихэнхи классууд нь энэ функыг дахин тодорхойлдог (overrides).
  • Reflection
    Java програмчлалын хэл нь динамик програмчлалын хэд хэдэн боломжуудыг өөртөө агуулсан хэл юм. Тэдгээрээс өөр хоорондоо харилцан хамаарал бүхий reflection ба interspection гэсэн 2 чухал ойлголт байдаг.
    Reflectionхэмээх ойлголт нь програмлчлалд классыг биелэлтийн үед нь динамикаар холбож, тухайн классын гишүүн өгөгдөл, гишүүн функцууд болон байгуулагч функцуудтай динамикаар харьцах боломжийг бүрдүүлдэг. Өөрөөр хэлбэл reflection хэмээх ойлголт нь биелэлтийн өмнө сайн мэдэхгүй класстайгаа харьцан ажиллах боломжийг бүрдүүлдэг.
    Introspectionгэдгийг “өөрлүүгээ харах” (look inside) гэж утгачилан орчуулна. Энэ нь програм нь өөр рүүгээ эргэн харж өөрт тодорхойлогдсон класс, түүний эх класс болон түүний гишүүд, байгуулагч функцуудын талаар дэлгэрэнгүй мэдээлэл авах боломжийг бүрдүүлж өгдөг.
    Дээрх 2 ойлголт нь хоорондоо салшгүй холбоо хамааралтай ойлголтууд юм. Тэдгээр нь хамтдаа нийлсэнээр динамик програмчлалын бодит хэрэгжилт болно. Энэ нь заримдаа Мета-програмчлал ч гэж нэрлэгддэг.
    Мета-програмчлал нь аливаа нэг програм нь биелэлтийн ( runtime) явцадөөр бусад програмуудыг (эсвэл өөрийгөө ) удирдан зохион байгуулан, тэдгээрийн зохицон ажлуулах боломжийг дэмждэг.
    Мөнтүүнчлэн introspection нь полиморфизм хэмээх ойлголтыг өвөрмөц аргаар (ОХ бус аргаар) хэрэгжүүлдэг.
  • java.lang.reflectпакет дахь классыг импортлох
    Дэлгэрэнгүй харахыг хүссэн класс/интерфейсийнхээ нэрийг програмд 0-р аргумент болгон дамжуулах
    Класс/интерфейсийн тодорхойлогч
    public class Student {…} эсвэл
    public interface Cafe {…}
    InterfaceCafeextends University{ …} эсвэл
    public class Student extends Person{ …}
    InterfaceCafe extendsUniversity{ …} эсвэл
    public class Student extends Person{ …}
    print_method_or_constructor() гэсэн статик функцын тусламжтай байгуулагч функцуудын мэдээлэл харах
    print_field() гэсэн статик функцын тусламжтай
    гишүүн өгөгдлийн талаарх мэдээлэл харах
    print_method_or_constructor() гэсэн статик функцын тусламжтайгишүүн функцын талаарх мэдээлэл харах
  • Жишээ (Reflection): Классын гишүүдтэй танилцах
    Энд ашиглагдсан функцууд
    Class классын
    • isInterface();- Тухайн object reference type нь интерфейс эсэхийг шалгах функц
    • getModifiers();-Тухайн класс/интерфейсийн хандалтыг тодорхойлогчийг унших
    • getName();-Тухайн класс/интерфейсийн нэрийг унших
    • getSuperclass(); - Тухайн класс/интерфейсийн эх классыг буцаах
    • getInterfaces();- Тухайн класс/ интерфейстэй холбогдсон интерфейсүүдийг буцаах
    • getDeclaredConctructors();-Тухайн классд тодорхойлогдсон байгуулагч функцуудыг буцаах
    • getDeclaredFileds();-Тухайн классд тодорхойлогдсон гишүүн өгөгдлүүдийг буцаах
    • getDeclaredMethods();-Тухайн классд тодорхойлогдсон гишүүн функцуудыг буцаах
  • Төрөл хувиргалт
  • Энд ашиглагдсан функцууд
    Class классын
    • isArray();- Тухайн object reference type нь массив эсэхийг шалгах функц
    Field классын
    • getModifiers();-Тухайн гишүүн өгөгдлийн хандалтыг тодорхойлогчийг буцаах
    • getType();-Тухайн гишүүн өгөгдлийн төрлийг буцаах
    • getName(); - Тухайн гишүүн өгөгдлийн нэрийг буцаах
    Method классын
    • getReturnType();- Тухайн гишүүн функцын буцаах утгыг буцаах
    • getParameterTypes();-Тухайн гишүүн функцын парамет-рүүдийн төрлүүдийг буцаах
    • getExceptionTypes();-Тухайн гишүүн функцын хаях онцгой тохиолдлуудын төрлүүдийг буцаах
    Constructor классын
    • getParameterTypes();-Тухайн
    байгуулагч функцынпарамет-
    рүүдийн төрлүүдийг буцаах
    • getExceptionTypes();-Тухайн
    байгуулагч функцын хаях онцгой
    тохиолдлуудын төрлүүдийг
    буцаах
  • ҮР ДҮН:
    ShowClass.java
    Reflection
    of Student class
  • ҮР ДҮН:
    ShowClass.java
    Reflection
    of University interface
  • Жишээ (Reflection): Invoking method dynamically
    • Тухайн классаас харгалзахгишүүн функцыг уншихgetMethod(methodname, parameters);
    • Тухайн гишүүн функцыг динамикаар холбож ажлуулах methodname.invoke(target, arguments);
  • Жишээ: Reflection
    Багш (Teacher) классыг авч үзъе.
    Одоо түүний объектуудыг тодорхойлъё:
    Энэ тохиолдолд бид Сургууль (School) классыг сайтар мэдэх бөгөөд түүн рүү кодчилолын явцад хандаж чадна.
    Хэрэв Сургууль (School) классд зарим өөрчлөлт орвол (гишүүн функц нь өөрчлөгдөх эсвэл шинээр нэмэгдэнэ гэж үзвэл) бид кодоо дахин бичих шаардлага гарна.
    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 + " at " + address; }
    }
    School school = new School();
    school.setName("KTMC");
    school.setAddress("Sansar, UB, Mongolia");
  • Reflection хэмээх ойлголтын тусламжтай бид тэдгээр асуудлыг хялбар аргаар шийдэж болно.
    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("school.properties"));
    Object object = Class.forName("csms.sw203.school.School").newInstance();
    Enumeration keys = prop.keys();
    while (keys.hasMoreElements()) {
    String key = (String) keys.nextElement();
    String value = prop.getProperty(key);
    String methodName = "set" + 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-ээс класс үүсгэх
    Гишүүн функцыг динамикаар тодорхойлох
    Функцыг динамикаар холбох
    Жишээ: Reflection
  • createSchool()фунцыг дэлгэрэнгүй авч үзье.
    Дээрх 2 мөр нь CLASSPATH –аас “school.properties” текст файлыг ачаалдаг.
    Properties гэдэг нь Java класс юм. Түүнийг “properties” нэртэй текст файлд хадгалах бөгөөд дараах форматтай.
    name=value
    Энэхүү Properties класс нь “names” болон “values”-ийг тодорхойлох функцээр хангагдсан.
    this.getClass().getResourceAsStream("school.properties") гэсэн мөрөнд тухайн идэвхитэй замаас School.properties файлын агуулгыг унших
    Дээрх мөр нь reflection-той холбоотой 2 онцлогийг ашиглана.dynamic class loadingбаdynamic instantiation.
    Class.forName("csms.sw203.school.School") мөр нь JVM-д “csms.sw203.school” нэртэй пакетаас "School“ нэртэй классыг хайж олоод санах ойд ачааллах үүрэг өгнө. Үр дүнд нь динамкаар ачаалагдсан классын объектыг буцааана.
    Properties prop = new Properties();
    prop.load(this.getClass().getResourceAsStream("school.properties"));
    Object object = Class.forName("csms.sw203.school.School").newInstance();
    Жишээ: Reflection
  • Дээрх мөрөнд объектыг динамикаар үүсгэж байна.
    Бид Properties файлаас хүссэн утгаа хайж олохын тулд түлхүүр (key) ашиглах шаардлагатай. Энэ түлхүүр нь Properties файл дахь name хэсэг юм.
    Object object = Class.forName("csms.sw203.school.School").newInstance();
    Enumeration keys = prop.keys();
    while (keys.hasMoreElements()) {
    String key = (String) keys.nextElement();
    String value = prop.getProperty(key);
    ... ...
    }
    Жишээ: Reflection
  • Дээр schoool.properties файлын агуулгыг үзүүлсэн байна.
    property бүрт харгалзах setter функцыг School классд тодорхойлсон. Жишээ нь.
    name  setName()
    address  setAddress()
    Давталтын
    3 мөрөнд property key-д харгалзах функцын нэрийг гаргаж авч байна
    4 мөрөнд тухайн классаас тухайн нэрт харгалзах функцын нэрийг динамикаар тодорхойлж байна
    5 мөрөнд уг функцыг динамикаар холбож ажлуулж байна
    name=KTMC
    address=Sansar, Ulaanbaator, Mongolian
    Жишээ: Reflection
    Enumeration keys = prop.keys();
    while (keys.hasMoreElements()) {
    String key = (String) keys.nextElement();
    String value = prop.getProperty(key);
    String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
    Method method = object.getClass().getMethod(methodName, new Class[]{String.class});
    method.invoke(object, new Object[]{value});
    }
  • Давталт дахь сүүлчийн 2 мөрөнд анхаарлаа хандуулъя
    Функц гэдэгт тухайн функцын нэрээс гадна параметрүүдийг хамтад нь авч үздэг.
    Хэдийгээр функцын нэр нь адил боловч параметрийн төрлөөрөө ялгаатай бол харгалзах функцыг цааш хайх шаардлага гарна.
    Enumeration keys = prop.keys();
    while (keys.hasMoreElements()) {
    String key = (String) keys.nextElement();
    String value = prop.getProperty(key);
    String methodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1);
    Method method = object.getClass().getMethod(methodName, new Class[]{String.class});
    method.invoke(object, new Object[]{value});
    }
    Жишээ: Reflection