eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – Spring Sale 2026 – NPI EA (cat= Baeldung)
announcement - icon

Yes, we're now running our Spring Sale. All Courses are 30% off until 31st March, 2026

>> EXPLORE ACCESS NOW

Partner – Diagrid – NPI EA (cat= Testing)
announcement - icon

In distributed systems, managing multi-step processes (e.g., validating a driver, calculating fares, notifying users) can be difficult. We need to manage state, scattered retry logic, and maintain context when services fail.

Dapr Workflows solves this via Durable Execution which includes automatic state persistence, replaying workflows after failures and built-in resilience through retries, timeouts and error handling.

In this tutorial, we'll see how to orchestrate a multi-step flow for a ride-hailing application by integrating Dapr Workflows and Spring Boot:

>> Dapr Workflows With PubSub

Course – Spring Sale 2026 – NPI (cat=Baeldung)
announcement - icon

Yes, we're now running our Spring Sale. All Courses are 30% off until 31st March, 2026

>> EXPLORE ACCESS NOW

1. Overview

Java Reflection provides powerful capabilities to inspect and manipulate objects at runtime. Two commonly used tools for working with object properties dynamically are the Beans Property API (java.beans.PropertyDescriptor) and Apache Commons BeanUtils. While PropertyDescriptor enables low-level access to properties via getter and setter methods, Commons BeanUtils simplifies common operations such as reading, writing, populating from maps, and copying bean properties.

In this tutorial, we’ll discuss Java Reflections Beans Property API in detail.

2. A Real-World Example: Working with the Post Bean

Let’s begin by creating a practical and straightforward Java bean to represent a blog post entity. Real-world software often requires the dynamic inspection or manipulation of object properties, especially in frameworks and libraries that rely heavily on metadata and configurations, such as Object-Relational Mapping (ORM) tools, serialization libraries, and UI frameworks. The following Post class illustrates a typical Java bean with properties for title, author, and metadata:

public class Post {
    private String title;
    private String author;
    private Metadata metadata;

    // Getters and Setters

    public static class Metadata {
        private int wordCount;

        // Getters and Setters
    }
}

Next, we’ll examine in detail how we can dynamically inspect and manipulate these properties at runtime, demonstrating common use cases in practical development scenarios.

3. Using PropertyDescriptor and BeanInfo

Before diving deeper into specific methods, it’s beneficial to understand the two primary Java introspection classes we’ll be working with—BeanInfo and PropertyDescriptor. The BeanInfo class encapsulates information about a Java Bean, detailing its properties, methods, and events. On the other hand, PropertyDescriptor represents the metadata of a single property, providing dynamic access to getter and setter methods. These classes form the backbone of Java’s introspection capability, allowing us to perform sophisticated, runtime property manipulations effortlessly.

3.1. Inspecting Bean Properties with Introspector.getBeanInfo()

We can inspect the structure of beans through the Introspector class:

BeanInfo beanInfo = Introspector.getBeanInfo(Post.class);
for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
    System.out.println(pd.getName());
}

In this example, Java introspection identifies all the properties within the Post bean, including the implicit “class” property that comes from Java’s Object superclass:

author
class
metadata
title

Using this class, we can inspect bean properties at runtime. It’s a practical way to make applications more flexible and adaptable.

3.2. Locating Property Metadata

When we want to manipulate a single property at runtime, the first step is to create a PropertyDescriptor for the target property and bean class:

PropertyDescriptor titlePd = new PropertyDescriptor("title", Post.class);

We can think of this descriptor as a little “cheat sheet” that tells Java everything it needs to know about the property – right down to where its getter and setter methods live.

3.3. Extracting Accessor Methods

Once we have the descriptor, we can retrieve the property’s accessor methods:

Method write = titlePd.getWriteMethod();
Method read = titlePd.getReadMethod();

The setter (write) updates the property’s value, while the getter (read) retrieves it. This step bridges the gap between metadata and runtime execution.

Since these may return null if a getter or setter doesn’t exist, we should always check before invoking.

3.4. Invoking Methods Reflectively

Finally, we use Method.invoke() to call the accessors on a specific bean instance:

if (write != null) {
    write.invoke(post, "Reflections in Java");
}
if (read != null) {
    String value = (String) read.invoke(post);
    System.out.println(value);
}

Since Method.invoke() always returns an Object, we must cast the result to the correct type when reading.

By following this three‑step recipe: descriptor creation, accessor extraction, invocation—we can read or write any Java‑Bean property dynamically while still executing the bean’s business logic (validation, events, logging) hidden inside its getters and setters.

4. Working Faster with Apache Commons BeanUtils

Apache Commons BeanUtils builds on the same reflection mechanisms but hides much of the boilerplate. Before diving into individual operations, we’ll declare the Maven dependency that pulls the library:

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.11.0</version>
</dependency>

4.1. Simple Property Access

The first improvement BeanUtils offers is BeanUtils.setProperty() and BeanUtils.getProperty(). These helper methods save us from creating a PropertyDescriptor by hand:

Post post = new Post();
BeanUtils.setProperty(post, "title", "Commons BeanUtils Rocks");
String title = BeanUtils.getProperty(post, "title");

Underneath, the library still discovers the proper getter and setter through reflection, but the call site stays short and expressive.

4.2. Populating a Bean from a Map

Web code often receives data as key-value pairs (for example, request parameters or JSON objects deserialized into a Map<String, Object>). BeanUtils can hydrate an entire bean in one line:

Map<String, Object> data = Map.of("title", "Map → Bean", "author", "Baeldung Team");
BeanUtils.populate(post, data);

Internally, populate() iterates over the map and delegates to setProperty() for every entry, giving us a concise bridge between dynamically‑typed input and strongly‑typed domain models.

4.3. Copying Bean Properties

Transferring state between two Java objects is another frequent task. BeanUtils.copyProperties() performs a shallow copy where matching names are copied and unmatched ones are ignored:

Post source = new Post();
source.setTitle("Source");
source.setAuthor("Alice");

Post target = new Post();
BeanUtils.copyProperties(target, source);

Because the method is reflective, we can execute the statement above without the two beans sharing a common interface. This pattern shines when mapping between DTOs and JPA entities.

4.4. Type Conversion and Nested Paths

Beyond plain strings, BeanUtils utilizes ConvertUtils to automatically coerce primitive types. We can register additional converters for domain‑specific classes:

ConvertUtils.register(new LocalDateConverter(), LocalDate.class);

Moreover, the library understands dotted property paths:

if (post.getMetadata() == null) {
    post.setMetadata(new Post.Metadata());
}
BeanUtils.setProperty(post, "metadata.wordCount", 850);

Since nested properties may be null, we should initialize them before using BeanUtils to avoid a NullPointerException.

And indexed properties:

BeanUtils.setProperty(post, "tags[0]", "reflection");

4.5. Handling Checked Exceptions Gracefully

Every BeanUtils call declares IllegalAccessException, InvocationTargetException, and NoSuchMethodException. In production code, we will wrap those in an application‑specific unchecked exception to avoid cluttering service signatures:

try {
    BeanUtils.copyProperties(target, source);
} catch (ReflectiveOperationException ex) {
    throw new IllegalStateException(ex);
}

5. Security Considerations When Using Reflection

Reflection is a powerful tool, but it comes with security implications that we should not overlook:

  • Bypassing Access Controls – Reflection can access private fields and methods if setAccessible(true) is used. This can break encapsulation and expose sensitive data
  • Injection Risks – If method or property names from user input (e.g., HTTP parameters, JSON keys), an attacker could manipulate them to call unintended setters or getters
  • Mass Assignment Vulnerabilities – Utilities like BeanUtils.populate() can set multiple properties at once. Without restrictions, this may lead to unauthorized changes in security-sensitive fields

6. Conclusion

Java Reflection, through tools like PropertyDescriptor and Apache Commons BeanUtils, empowers us to build flexible, metadata-driven applications with minimal boilerplate.  These capabilities prove invaluable when working with frameworks, serializers, or data-mapping layers where dynamic behavior is a must. Although we need to handle reflection’s checked exceptions and performance trade-offs, the expressive power and decoupling these tools provide make them essential. Whether we need precision or convenience, both approaches serve us well in modern Java development.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

Course – Spring Sale 2026 – NPI EA (cat= Baeldung)
announcement - icon

Yes, we're now running our Spring Sale. All Courses are 30% off until 31st March, 2026

>> EXPLORE ACCESS NOW

Course – Spring Sale 2026 – NPI (All)
announcement - icon

Yes, we're now running our Spring Sale. All Courses are 30% off until 31st March, 2026

>> EXPLORE ACCESS NOW

eBook Jackson – NPI EA – 3 (cat = Jackson)