Photo by Justin Leibow on Unsplash

Hello, reader! We’re going to go on a journey through the treacherous world of Java Class shadowing, discuss circumventing using shading, and finish with a walk through using Gradle. If you’re already familiar with the perils of Java Class shadowing feel free to skip ahead to the section on shading.

Java class shadowing

A Java application runs by loading Java classes on to the JVM. Classes are loaded by class loaders. In most cases¹ your application code will be loaded by a single class loader: the System class loader. The System class loader looks up classes on the user-specified classpath². The classpath includes…


This post contains some of the lessons I’ve learned in the past decade of growing my career. I hope they resonate with engineers of all levels, and help early to mid-level software engineers advance their careers. Some of the lessons may seem to be stating the obvious (eg “be organized”, “communicate effectively”), but spelling out exactly what they mean can provide the focus needed to make meaningful advances. Others are not as intuitive, but are instrumental in growing your skills and impact. You don’t have to be great at every one of these areas, but every little bit helps.

Don’t let code intimidate you


Protocol buffers are a mechanism for sending data through the series of tubes known as the Internet. One common use of them is to define gRPC specifications — essentially a form of remote procedure calls. With gRPC service definitions, you create a “service” that has RPC methods. These RPC methods take a request “message” and return a response “message”.

service FooService {
rpc GetFoo (GetFooRequest) returns (GetFooResponse);
message GetFooRequest {
string id = 1;
message GetFooResponse {
string fooName = 1;
int64 fooValue = 2;

Protobuf and gRPC are powerful tools and can be used in a…

Spring is a popular Java framework that is often used to build web applications. One of the features it provides is what it calls “Inversion of Control” — essentially dependency injection, similar to that provided by Guice. That said, Guice DI and Spring IoC have some subtle differences; this article is aimed at Java developers familiar with Guice, to provide a perspective on Spring IoC from the perspective of Guice DI.

Dependency injection in Guice is done using the @Inject annotation. This can be applied to constructors, setters, and fields. …

Ammar Khaku Thoughts are my own.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store