Gọi phương thức động (Dynamic Method Call) đối tượng Corba Gọi phương thức động (Dynamic Method Call) đối tượng Corba Bởi: Khoa CNTT ĐHSP KT Hưng Yên Sử dụng kỹ thuật phản chiếu(reflect) Java Trong Java,bạn dùng kỹ thuật phản chiếu(reflect) để truy tìm phương thức đốitượng Corba.Cơ chế giúp bạn gọi phương thức đối tượng Corba bấtkỳ mà không cần dùng đến lớp giao tiếp interface trình chủ cung cấp Điều tương tự chế gọi phương thức đối tượng RMI.Sau chương trình ví dụ:Đối tượng Friend ta đối tượng Corba cung cấp phương thức greeting() để trình khách triêụ gọi.Trình khách không dùng trực tiếp lớp Friend.class idlj sinh để triệu gọi phương thức greeting().Thay vào trình khách sử dụng kỹ thuật reflect Java để triệu gọi greeting().Chương trình gồmcác bước sau: Bước 1:Đặc tả đối tượng Friend ngôn ngữ IDL Ví dụ: Friend.idl Interface Friend{ String greeting (in string name); }; Tiếp đến ta dùng trình dịch idlj để chuyển đổi đặc tả thành tập tin cần dungcho hai phía khách chủ idl- fall Friend.idl Lưu ý :Thay cho tham số dòng lệnh- fserver –fclient ta dùng –fall để yêucấu trình dịch idlj sinh tập tin trung gian phục vụ cho hai phía khách chủ 1/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba Bước 2: Phần cài đặt cho đối tượng Corba Friend Java thực thông qua lớp FriendServant sau: Ví dụ: FriendServant.Java public class FriendServant extends_FriendImplBase{ public String greeting(String name){ return ”Hello”+ name+ ”from Corba!”; } } Bước 3:Thiết kế chương trình dăng ký đối tượng Friend với dịch vụ COS Naming Ví dụ: Setup.Java import org.omg.Corba.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import java.util.Properties; public class Setup{ public static void main(String args[]) throws Exception{ System.out.println("Corba Friend Object"); ORB orb=ORB.init(args,null); Friend servant= new FriendServant(); orb.connect(servant); org.omg.Corba.Object nameService= orb.resolve_initial_references("NameService"); NamingContext nsContext= 2/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba NamingContextHelper.narrow(nameService); NameComponent nc=new NameComponent("FriendObject",""); NameComponent path[]={nc}; nsContext.rebind(path,servant); //Cho nhan yeu cau tu may khach java.lang.Object obj=new java.lang.Object(); synchronized(obj){ obj.wait(); } } } Như thấy việ cài đặt đăng ký đối tượng Corba gìđặc biệt.Nó hoàn toàn giống ví dụ Nhưng điểm khác biệt trình khách mà ta viết sau không dùng lớp Friend.class để gọi đối tượng chủ.Trình khách sử dụng kỹ thuật reflect Bước 4: Xây dựng trình khách Ví dụ : Client.Java import org.omg.Corba.*; import org.omg.CosNaming.*; import java.lang.reflect.*; public class Client { public static void main(String args[])throws Exception{ ORB orb = ORB.init(args,null); org.omg.Corba.Object nameService= 3/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba orb.resolve_initial_references("NameService"); NamingContext nsContext=NamingContextHelper.narrow(nameService); NamingComponent nc=new NameComponent("FriendObject",""); NameComponent path[]={nc}; //Chuyen tham chieu cua doi tuong Corba doi tuong Java java.lang.Object o=(java.lang.Object)nscontext.resolve(path); //Truy tim xuat xu cua lop doi tuong Class c=o.getClass(); //Dinh kieu phuong thuc cua tham so can goi Class []parameterTypes=new Class[]{String.class}; //Truy tìm phương thức cần gọi Method theMethod; theMethod=c.getMethod("greeting",parametterType); //Dinh doi so truyen vao phuong thuc can goi java.lang.Object[] arguments=new jva.lang.Object[] {"Jerry"}; //Goi phuong thuc va nhan ket qua tra ve String result=(String) theMethod.invoke(o,arguments); System.out.println (result) ; } } Bước 5:Biên dịch chạy chương trình Với chương trình bên server 4/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba javac *.java start tnameserv java Setup Với chương trình bên Client javac *.java start tnameserv java Client Sử dụng kỹ thuật gọi động (DII- Dynamic Invocation Interface) Corba Kỹ thuật phản chiếu (reflect) đặc trưng riêng ngôn ngữ java Corba xây dựng với mục đích dùng cho đa ngôn ngữ nên thân Corba dựa vào khả phản chiếu mà Java cung cấp Corba cung cấp cho bạn cách gọi động phương thức đối tượng Corba Corba gọi khả “giao tiếp gọi động” (Dynamic Invocation Interface) Với kỹ thuật trình khách client yêu cầu trình môi giới ORB duyệt qua phương thức mà đối tượng Corba nắm giữ Truyền tham số triệu gọi phươngthức mà không cần đến lớp tham chiếu tường minh đối tượng Ví dụ viết kỹ thuật reflect Java viết lại theo phong cách Corba sau: Ví dụ: ClientCorba.Java import org.omg.Corba.*; import org.omg.CosNaming.*; public class ClientCorba{ public static void main(String args[])throws Exception{ ORB orb=ORB.init(args,null); org.omg.Corba.Object nameService= orb.resolve_initial_references("NameService"); NamingContext nsContext=NamingContextHelper.narrow(nameService); 5/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba NameComponent nc=new NamingComponent("FriendObject",""); NameComponent path[]={nc}; //Lay ve tham chieu tong quat cua doi tuong Corba Org.omg.Corba.Object o=nsContext.resolve(path); //Yeu cau Corba truy tìm tra ve tham chieu cua phuong thuc greeting doi tuong Corba Org.omg.Corba.Request request=o._request("greeting”); //Tao doi tuong truyen vao ham greeting Request.add_in_arg().insert_string("Jerry"); //Dinh kieu tra ve cua phương thức greeting Request.set_return_type(orb.get_primitive_tc(org.omg.Corba.TCKind tk_string)); //Trieu goi phuong thuc greeting Request.invoke(); //Lay ket qua tra ve sua goi ham String result=request.result().value().extract_string(); System.out.println(result); } } Ở ví dụ trên,sau lấy tham chiếu đối tượng Corba lệnh Org.omg.Corba.Request request=o._request(“greeting”); Biết đối tượng Corba o vừa lấy có chứa phương thức mang tên “greeting” ta yêu cầu o trả tham chiếu phương thức sau: 6/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba org.omg.Corba.request request=o._request(“greeting”); Dựa vào đối tượng Request bạn truyền đối số gọi phương thức “greeting” cách gián tiếp sau: //Tạo đối số kiểu chuỗi để truyền vào greeting Request.add_in_arg().insert_string(“Jerry”); //Định kiểu trả phương thức greeting Request.set_retủn_type(ỏb.get_primitive_tc(org.omg.Corba.TCKind.tk_ string)); //Triệu gọi phương thức greeting Request.invoke(); //Lấy kết trả sau gọi hàm String result=request.result().value().extract_string() Invoke() dùng để triệu gọi phương thức mà đối tượng Request tham chiếu đến Khi bạn triệu gọi phương thức, giá trị trả đối tượng Request quản lý Bạn định kiểu liệu trả cho phương thức gọi cách gọi set_return_type() Request Corba cung cấp cho bạn nhiều định kiểu trả như: TCKind.tk_string, TCKind.tk_float, TCKind.tk_char, TCKind_long…trả kiểu chuỗi nên ta sử dụng TCKind.tk_string để định kiểu Sau lời gọi invoke() bạn gọi phương thức result()để nhận kết trả Biên dịch chạy trình khách ClientCorba Kết kết xuất hoàn toàn tương tự ví dụ 7/7 ... 6/7 Gọi phương thức động (Dynamic Method Call) đối tượng Corba org.omg .Corba. request request=o._request(“greeting”); Dựa vào đối tượng Request bạn truyền đối số gọi phương thức “greeting” cách... Corba dựa vào khả phản chiếu mà Java cung cấp Corba cung cấp cho bạn cách gọi động phương thức đối tượng Corba Corba gọi khả “giao tiếp gọi động (Dynamic Invocation Interface) Với kỹ thuật trình.. .Gọi phương thức động (Dynamic Method Call) đối tượng Corba Bước 2: Phần cài đặt cho đối tượng Corba Friend Java thực thông qua lớp FriendServant