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.

Java Course 9: Networking and Reflection


Published on

Lecture 9 from the IAG0040 Java course in TTÜ.
See the accompanying source code written during the lectures:

Published in: Technology
  • Be the first to comment

Java Course 9: Networking and Reflection

  1. 1. Java course - IAG0040 Networking, Reflection & LoggingAnton Keks 2011
  2. 2. Networking ● Java provides cross-platform networking facilities ● and packages contain many useful classes ● API is generally protocol independent, but implementation supports mostly Internet transport protocols, e.g. TCP and UDP ● represents an IP address (immutable) – Inet4Address represents 32-bit IPv4 addresses (4 billions) – Inet6Address represents 128-bit IPv6 addresses (3.4 x 10 38) – It is able to detect address types, provides naming services, and various other checks and conversions – Create using InetAddress.getByAddress(...), getByName(...) or getLocalHost() – Many getXXX() and isXXX() methods providedJava course – IAG0040 Lecture 9Anton Keks Slide 2
  3. 3. Sockets ● Sockets are used as endpoints in network communication ● represents an address-port pair ● There are several types of sockets in Java – Socket and ServerSocket – connection-oriented streaming reliable client and server sockets (TCP) – SSLSocket and SSLServerSocket – client and server sockets for secure encrypted communication (TCP via SSL) – DatagramSocket – packet-oriented unreliable socket for both sending and receiving data (UDP), can be used for both unicasting and broadcasting – MulticastSocket – datagram socket with multicasting support ● Socket implementations depend on respective factory classes. Direct usage uses the default socket factory for the given socket type.Java course – IAG0040 Lecture 9Anton Keks Slide 3
  4. 4. Networking Exceptions ● Most networking exceptions extend SocketException ● SocketException extends IOException, showing that networking is highly related to all other more generic I/O classesJava course – IAG0040 Lecture 9Anton Keks Slide 4
  5. 5. Streaming Sockets ● Socket and ServerSocket can be used for streaming ● Underlying Socket implementations are provided by SocketImplFactory classes by the means of SocketImpl classes. Default implementation is plain TCP. ● getInputStream() and getOutputStream() are used for obtaining the streams, both can be used simultaneously ● Various socket options may be set using provided set methods ● There are many informative is/get methods provided ● Stream sockets must be closed using the close() method – it closes both streams automatically as wellJava course – IAG0040 Lecture 9Anton Keks Slide 5
  6. 6. Datagram Sockets ● DatagramSocket is used for sending and receiving of DatagramPackets; receiving is actually listening ● Connection-less, no streams provided ● connect() and disconnect() is used for selecting/resetting the remote partys address and port ● Special addresses can be used for sending/receiving of broadcast packets, e.g. ● MulticastSocket can be used for joining/leaving multicast groups of DatagramSockets. Multicast groups have special addresses.Java course – IAG0040 Lecture 9Anton Keks Slide 6
  7. 7. URL and URLConnection● Java also provides higher-level networking APIs than Sockets● URI and URL classes provide construction and parsing of the respective Strings (all URLs are URIs, however) – URI is a newer class and provides encoding/decoding of escaped symbols, like %20 – Conversions back and forth are possible using toURI() and toURL() methods● URLConnection provides API for reading/writing of the resources referenced by URLs● url.openConnection() returns a subclass of URLConnection, according to the registered protocol-specific URLStreamHandler Lecture 9 Slide 7
  8. 8. URL and URLConnection (cont)● Obtained URLConnection can be used for setting various parameters (headers) – Actual connection is opened using the connect() method – Both getInputStream() and getOutputStream() are provided – getContent() returns an Object according to the MIME type of the resource, which ContentHandler is provided by the ContentHandlerFactory● url.openStream() is a shortcut if you need to just retrieve the data without any extra features● Proxy/ProxySelector can be used for proxying of traffic Lecture 9 Slide 8
  9. 9. Networking Task● Implement the FileDownloader (eg using existing DataCopier implementation)● Try your code with various Input and Output streams – Files, Sockets, URLs● Create FileSender and FileReceiveServer classes. Reuse already written code to send file content over the socket and save content to another file on the server end Lecture 9 Slide 9
  10. 10. Reflection API ● The reflection API represents, or reflects, the classes, interfaces, and objects in the current JVM – It is possible to dynamically collect information about all aspects of compiled entities, even access private fields ● Reflection API is in java.lang and java.lang.reflect packages ● Note: Reflection API is also full of generics (for convenience)Java course – IAG0040 Lecture 9Anton Keks Slide 10
  11. 11. Reflection API usage ● Where is it appropriate to use it? – various plugins and extensions: load classes by name, etc – JUnit uses reflection for finding test methods either by name or annotations – Many other famous frameworks use reflection, e.g. Hibernate, Spring, Struts, Log4J, JUnit, etc ● Caution: use reflection only when it is absolutely necessary!Java course – IAG0040 Lecture 9Anton Keks Slide 11
  12. 12. Examining Classes● Class objects reflect Java classes – Every Object provides the getClass() method – Various methods of Class return instances of Field, Method, Constructor, Package, etc ● methods in plural return arrays, e.g. getFields(), getMethods() ● methods in singular return single instances according to search criteria, e.g. getField(...), getMethod(...) – Class can also represent primitive types, interfaces, arrays, enums and annotations● Java supports Class literals, e.g. String.class, int.class● Class.forName() is used for loading classes dynamically● Modifiers: Modifier.isPublic(clazz.getModifiers())● getSuperclass() returns the super classJava course – IAG0040 Lecture 9Anton Keks Slide 12
  13. 13. Instantiating Classes ● clazz.newInstance() works for default constructors ● Otherwise getConstructor(...) will provide a Constructor instance, which has its own newInstance(...) ● Singular Constructor and Method finding methods take Class instances for matching of parameters: – Constructor c = clazz.getConstructor(int.class, Date.class); ● Then, creation (newInstance) or invocation (invoke) takes the real parameter values: – Object o = c.newInstance(3, new Date()); – Primitive values are autoboxed to their wrapper classesJava course – IAG0040 Lecture 9Anton Keks Slide 13
  14. 14. Reflection Tips ● Array class provides additional options for dynamic manipulation of arrays ● Even this works: byte[].class ● Retrieve class name of any object: object.getClass().getName() ● Dont hardcode class names in Strings: MegaClass.class.getName() or .getSimpleName() is better ● Accessing private fields: – boolean wasAccessible = field.getAccessible(); field.setAccessible(true); Object value = field.get(instance); field.setAccessible(wasAccessible); ● Dynamic proxies allow to wrap objects and intercept method calls on them defined in their implemented interfaces: – Object wrapped = Proxy.newProxyInstance( o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() { ... });Java course – IAG0040 Lecture 9Anton Keks Slide 14