Oracle Certified Professional Java SE 11 Developer
1 Java Fundamentals
1-1 Java Basics
1-1 1 Java Platform Overview
1-1 2 Java Development Environment
1-1 3 Java Program Structure
1-1 4 Java Virtual Machine (JVM)
1-1 5 Java Development Kit (JDK)
1-1 6 Java Runtime Environment (JRE)
1-2 Object-Oriented Programming (OOP) Concepts
1-2 1 Classes and Objects
1-2 2 Inheritance
1-2 3 Polymorphism
1-2 4 Encapsulation
1-2 5 Abstraction
1-2 6 Interfaces
1-2 7 Abstract Classes
1-3 Data Types and Variables
1-3 1 Primitive Data Types
1-3 2 Reference Data Types
1-3 3 Variable Declaration and Initialization
1-3 4 Type Conversion and Casting
1-3 5 Arrays
1-4 Control Flow
1-4 1 Conditional Statements (if, else, switch)
1-4 2 Looping Constructs (for, while, do-while)
1-4 3 Break and Continue Statements
1-4 4 Exception Handling
2 Java Collections Framework
2-1 Collections Overview
2-1 1 Collection Interfaces
2-1 2 Collection Classes
2-1 3 Collection Algorithms
2-2 Lists
2-2 1 ArrayList
2-2 2 LinkedList
2-2 3 List Operations
2-3 Sets
2-3 1 HashSet
2-3 2 TreeSet
2-3 3 LinkedHashSet
2-4 Maps
2-4 1 HashMap
2-4 2 TreeMap
2-4 3 LinkedHashMap
2-5 Queues and Deques
2-5 1 PriorityQueue
2-5 2 ArrayDeque
3 Java Streams and Lambda Expressions
3-1 Lambda Expressions
3-1 1 Lambda Syntax
3-1 2 Functional Interfaces
3-1 3 Method References
3-2 Streams
3-2 1 Stream Creation
3-2 2 Intermediate Operations
3-2 3 Terminal Operations
3-2 4 Parallel Streams
4 Java Concurrency
4-1 Threads
4-1 1 Thread Creation
4-1 2 Thread States
4-1 3 Thread Synchronization
4-1 4 Thread Communication
4-2 Concurrency Utilities
4-2 1 Executor Framework
4-2 2 Concurrent Collections
4-2 3 Atomic Variables
4-2 4 Locks
5 Java IO and NIO
5-1 Input and Output Streams
5-1 1 Byte Streams
5-1 2 Character Streams
5-1 3 Buffered Streams
5-2 File IO
5-2 1 File Class
5-2 2 FileReader and FileWriter
5-2 3 FileInputStream and FileOutputStream
5-3 NIO (New IO)
5-3 1 Path Interface
5-3 2 Files Class
5-3 3 Channels and Buffers
5-3 4 Asynchronous IO
6 Java Date and Time API
6-1 Date and Time Classes
6-1 1 LocalDate
6-1 2 LocalTime
6-1 3 LocalDateTime
6-1 4 ZonedDateTime
6-2 Period and Duration
6-2 1 Period Class
6-2 2 Duration Class
6-3 Time Zones and Calendars
6-3 1 TimeZone Class
6-3 2 Calendar Class
7 Java Modules
7-1 Module System Overview
7-1 1 Module Declaration
7-1 2 Module Path
7-1 3 Module Dependencies
7-2 Module Resolution
7-2 1 Automatic Modules
7-2 2 Named Modules
7-2 3 Unnamed Modules
7-3 Module Services
7-3 1 Service Provider Interface (SPI)
7-3 2 ServiceLoader Class
8 Java Security
8-1 Security Basics
8-1 1 Security Manager
8-1 2 Permissions
8-1 3 Policy Files
8-2 Cryptography
8-2 1 Key Generation
8-2 2 Encryption and Decryption
8-2 3 Digital Signatures
8-3 Secure Coding Practices
8-3 1 Input Validation
8-3 2 Secure Communication
8-3 3 Authentication and Authorization
9 Java Networking
9-1 Networking Basics
9-1 1 InetAddress Class
9-1 2 URL and URLConnection Classes
9-2 Sockets
9-2 1 Socket Class
9-2 2 ServerSocket Class
9-2 3 DatagramSocket Class
9-3 Networking Protocols
9-3 1 TCPIP
9-3 2 UDP
9-3 3 HTTP
10 Java Database Connectivity (JDBC)
10-1 JDBC Basics
10-1 1 JDBC Architecture
10-1 2 JDBC Drivers
10-1 3 Establishing a Connection
10-2 Executing SQL Statements
10-2 1 Statement Interface
10-2 2 PreparedStatement Interface
10-2 3 CallableStatement Interface
10-3 ResultSet
10-3 1 ResultSet Interface
10-3 2 ResultSetMetaData Interface
10-4 Transaction Management
10-4 1 Commit and Rollback
10-4 2 Savepoints
11 Java Annotations
11-1 Annotation Basics
11-1 1 Annotation Types
11-1 2 Meta-Annotations
11-1 3 Annotation Processing
11-2 Standard Annotations
11-2 1 @Override
11-2 2 @Deprecated
11-2 3 @SuppressWarnings
11-3 Custom Annotations
11-3 1 Annotation Creation
11-3 2 Annotation Usage
12 Java Reflection
12-1 Reflection Basics
12-1 1 Class Class
12-1 2 Field Class
12-1 3 Method Class
12-2 Dynamic Class Loading
12-2 1 ClassLoader Class
12-2 2 Dynamic Proxy
12-3 Reflection API
12-3 1 Accessing Class Members
12-3 2 Modifying Class Members
13 Java Internationalization (I18N)
13-1 I18N Basics
13-1 1 Locale Class
13-1 2 ResourceBundle Class
13-2 Formatting
13-2 1 NumberFormat Class
13-2 2 DateFormat Class
13-2 3 MessageFormat Class
13-3 Character Encoding
13-3 1 Charset Class
13-3 2 String Encoding and Decoding
14 Java Platform Module System (JPMS)
14-1 Module System Overview
14-1 1 Module Declaration
14-1 2 Module Path
14-1 3 Module Dependencies
14-2 Module Resolution
14-2 1 Automatic Modules
14-2 2 Named Modules
14-2 3 Unnamed Modules
14-3 Module Services
14-3 1 Service Provider Interface (SPI)
14-3 2 ServiceLoader Class
15 Java 11 New Features
15-1 New String Methods
15-1 1 isBlank()
15-1 2 lines()
15-1 3 repeat()
15-2 New File Methods
15-2 1 writeString()
15-2 2 readString()
15-3 Local-Variable Syntax for Lambda Parameters
15-3 1 var Keyword in Lambda Expressions
15-4 HTTP Client API
15-4 1 HttpClient Class
15-4 2 HttpRequest Class
15-4 3 HttpResponse Class
15-5 Nest-Based Access Control
15-5 1 Nest Host and Nest Members
15-5 2 Nest Access Control
15-6 Epsilon Garbage Collector
15-6 1 Epsilon GC Overview
15-6 2 Epsilon GC Use Cases
15-7 Flight Recorder
15-7 1 Flight Recorder Overview
15-7 2 Flight Recorder Use Cases
15-8 Application Class-Data Sharing (CDS)
15-8 1 CDS Overview
15-8 2 CDS Use Cases
15-9 Deprecations and Removals
15-9 1 Deprecated Features
15-9 2 Removed Features
12.3 Reflection API Explained

12.3 Reflection API Explained

The Reflection API in Java SE 11 is a powerful tool that allows a program to examine and modify its own structure and behavior at runtime. This capability is particularly useful for frameworks, libraries, and tools that need to work with classes and objects dynamically. Understanding the Reflection API is essential for developing advanced Java applications.

Key Concepts

1. Class Objects

In Java, every class has an associated Class object that represents the metadata of the class. This object can be obtained using the .class syntax or the getClass() method. The Class object provides methods to inspect the class's fields, methods, constructors, and annotations.

Example

        Class<?> clazz = MyClass.class;
        System.out.println(clazz.getName());
    

2. Field Inspection

Reflection allows you to inspect the fields (variables) of a class. You can retrieve the names, types, and modifiers of the fields. This is useful for dynamically accessing and modifying field values.

Example

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName() + " : " + field.getType());
        }
    

3. Method Inspection

Reflection enables you to inspect the methods of a class. You can retrieve the names, parameter types, return types, and modifiers of the methods. This is useful for dynamically invoking methods.

Example

        Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName() + " : " + method.getReturnType());
        }
    

4. Constructor Inspection

Reflection allows you to inspect the constructors of a class. You can retrieve the parameter types and modifiers of the constructors. This is useful for dynamically creating instances of classes.

Example

        Constructor<?>[] constructors = clazz.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println(constructor.getName() + " : " + Arrays.toString(constructor.getParameterTypes()));
        }
    

5. Accessing Private Members

Reflection can access private fields, methods, and constructors by setting the accessible flag to true. This allows you to bypass the normal access controls and interact with private members.

Example

        Field privateField = clazz.getDeclaredField("privateField");
        privateField.setAccessible(true);
        privateField.set(objectInstance, "New Value");
    

6. Dynamic Method Invocation

Reflection allows you to invoke methods dynamically at runtime. This is useful for frameworks that need to call methods based on configuration or user input.

Example

        Method method = clazz.getDeclaredMethod("myMethod", String.class);
        method.invoke(objectInstance, "Parameter Value");
    

7. Creating New Instances

Reflection allows you to create new instances of classes dynamically. This is useful for frameworks that need to instantiate classes based on configuration or user input.

Example

        Constructor<MyClass> constructor = MyClass.class.getDeclaredConstructor(String.class);
        MyClass instance = constructor.newInstance("Constructor Parameter");
    

8. Annotations Inspection

Reflection allows you to inspect annotations on classes, methods, fields, and constructors. This is useful for frameworks that need to configure behavior based on annotations.

Example

        Annotation[] annotations = clazz.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation.annotationType().getName());
        }
    

9. Modifier Inspection

Reflection allows you to inspect the modifiers (such as public, private, static, final) of classes, methods, fields, and constructors. This is useful for understanding the access and behavior of these elements.

Example

        int modifiers = clazz.getModifiers();
        System.out.println(Modifier.isPublic(modifiers));
    

10. Package Inspection

Reflection allows you to inspect the package information of a class. This is useful for understanding the namespace and dependencies of a class.

Example

        Package pkg = clazz.getPackage();
        System.out.println(pkg.getName());
    

11. Superclass Inspection

Reflection allows you to inspect the superclass of a class. This is useful for understanding the inheritance hierarchy of a class.

Example

        Class<?> superClass = clazz.getSuperclass();
        System.out.println(superClass.getName());
    

12. Interface Inspection

Reflection allows you to inspect the interfaces implemented by a class. This is useful for understanding the contracts and behaviors enforced by interfaces.

Example

        Class<?>[] interfaces = clazz.getInterfaces();
        for (Class<?> iface : interfaces) {
            System.out.println(iface.getName());
        }
    

Examples and Analogies

Think of Java Reflection as a powerful microscope that allows you to examine the inner workings of your Java code at runtime. Just as a microscope allows you to see the tiny details of a specimen, Java Reflection allows you to see the details of classes, methods, fields, and more.

For example, if you are building a framework that needs to dynamically create objects based on user input, Java Reflection allows you to do this by inspecting the constructors of the classes and creating instances accordingly.

By mastering the Reflection API, you can create powerful and flexible Java SE 11 applications that can adapt to changing requirements and configurations, making your code more robust and maintainable.