SlideShare a Scribd company logo
Marvel of Annotation
by Alexey Buzdin
Preprocessing
@AlexeyBuzdin
GDGRiga.lv RigaDevDay.lv
๏ What?
๏ Why?
๏ How?
๏ Dagger
๏ Lombok
๏ MapStruct
๏ Retrofit
๏ What?
๏ Why?
๏ How?
๏ Dagger
๏ MapStruct
๏ Retrofit
๏ Lombok
“Developer loves
to write code”
“Developer loves
to write code”
- noone ever
“Developer loves
complex tasks”
“Developer loves
complex tasks”
- probably you
Marvel of Annotation Preprocessing in Java by Alexey Buzdin
CRUD
CRUD
- api
- type: XML, JSON
- resources
- /clients
- access: R
- entity
🔑 clientId
- full name
- email
- /payments
- entity
🔑 paymentId
🔑 clientId | link
- amount
- db: jdbc:mysql://localhost:3306/crudapp
CRUD
- api
- type: XML, JSON
- resources
- /clients
- access: R
- entity
🔑 clientId
- full name
- email
- /payments
- entity
🔑 paymentId
🔑 clientId | link
- amount
- db: jdbc:mysql://localhost:3306/crudapp
Authentication?
CRUD
- api
- type: XML, JSON
- resources
- /clients
- access: R
- entity
🔑 clientId
- full name
- email
- /payments
- entity
🔑 paymentId
🔑 clientId | link
- amount
- db: jdbc:mysql://localhost:3306/crudapp
- ldap: ldap://ldap.example.com/dc=example,dc=com
never let go of your
D R E A M S
In Practice
In Practice
Routing
XML, JSON
Building Response
public class SimpleServlet extends GenericServlet {



public void service(ServletRequest req, ServletResponse res)

throws ServletException, IOException {

// do something in here

}

}
Generic Servlet
In Practice
Routing
XML, JSON
Building Response
In Practice
Map
Validate
Routing
XML, JSON
Building Response
In Practice
Construct Query
Map
Validate
Routing
XML, JSON
Building Response
Reflection and
Runtime Code Generation
Everywhere!
Spring, Hibernate, GSON, Jersy, Dozer,
Guice, Weld, etc…
Reflection - Slow?
Reflection - Slow?
http://docs.oracle.com/javase/tutorial/reflect/index.html
Performance Overhead
Because reflection involves types that are dynamically resolved, certain
Java virtual machine optimizations can not be performed. Consequently,
reflective operations have slower performance than their non-reflective
counterparts, and should be avoided in sections of code which are
called frequently in performance-sensitive applications.
Reflection - Slow?
http://docs.oracle.com/javase/tutorial/reflect/index.html
Performance Overhead
Because reflection involves types that are dynamically resolved, certain
Java virtual machine optimizations can not be performed. Consequently,
reflective operations have slower performance than their non-reflective
counterparts, and should be avoided in sections of code which are
called frequently in performance-sensitive applications.
Reflection - Slow?
http://docs.oracle.com/javase/tutorial/reflect/index.html
Performance Overhead
Because reflection involves types that are dynamically resolved, certain
Java virtual machine optimizations can not be performed. Consequently,
reflective operations have slower performance than their non-reflective
counterparts, and should be avoided in sections of code which are
called frequently in performance-sensitive applications.
Code Generation?
https://zeroturnaround.com/rebellabs/how-to-make-java-more-dynamic-with-runtime-code-generation/
Code Generation?
https://zeroturnaround.com/rebellabs/how-to-make-java-more-dynamic-with-runtime-code-generation/
Generates Java Bytecode at Runtime
Code Generation?
https://zeroturnaround.com/rebellabs/how-to-make-java-more-dynamic-with-runtime-code-generation/
Generates Java Bytecode at Runtime
Not always ok
Code Generation?
https://zeroturnaround.com/rebellabs/how-to-make-java-more-dynamic-with-runtime-code-generation/
GWT, Android, j2objc,
RoboVM, code transpilers
Doesn’t work
Annotation Processing
Annotation Processing
A tool build in javac for scanning and
processing annotations at compile time
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
http://hannesdorfmann.com/annotation-processing/annotationprocessing101/
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
http://hannesdorfmann.com/annotation-processing/annotationprocessing101/
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
http://hannesdorfmann.com/annotation-processing/annotationprocessing101/
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
http://hannesdorfmann.com/annotation-processing/annotationprocessing101/
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
http://hannesdorfmann.com/annotation-processing/annotationprocessing101/
How?
MyProcessor.jar
- com
- example
- MyProcessor.class
- META-INF
- services
- javax.annotation.processing.Processor
com.example.MyProcessor
com.foo.OtherProcessor
net.blabla.SpecialProcessor
javax.annotation.processing.Processor
javac will run the process in separate JVM
Example
public class PizzaStore {
public Meal order(String mealName) {
if ("Margherita".equals(mealName)) return new MargheritaPizza();
if ("Calzone".equals(mealName)) return new CalzonePizza();
if ("Tiramisu".equals(mealName)) return new Tiramisu();
throw new IllegalArgumentException("Unknown meal '" + mealName + "'");
}
}
Example
public class PizzaStore {
private MealFactory factory = new MealFactory();
public Meal order(String mealName) {
return factory.create(mealName);
}
}
@Target(ElementType.TYPE) @Retention(RetentionPolicy.CLASS)
public @interface Factory {
Class type();
String id();
}
@Factory(
id = "Margherita",
type = Meal.class
)
public class MargheritaPizza implements Meal {
@Override public float getPrice() {
return 6f;
}
}
How?
public class MyProcessor extends AbstractProcessor {
@Override public synchronized void init(ProcessingEnvironment env){ }
@Override public boolean process(
Set<? extends TypeElement> annotations, RoundEnvironment env) { }
@Override public Set<String> getSupportedAnnotationTypes() { }
@Override public SourceVersion getSupportedSourceVersion() { }
}
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> annotataions = new LinkedHashSet<String>();
annotataions.add(Factory.class.getCanonicalName());
return annotataions;
}
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
typeUtils = processingEnv.getTypeUtils();
elementUtils = processingEnv.getElementUtils();
filer = processingEnv.getFiler();
messager = processingEnv.getMessager();
}
package com.example; // PackageElement
public class Foo { // TypeElement
private int a; // VariableElement
private Foo other; // VariableElement
public Foo () {} // ExecuteableElement
public void setA ( // ExecuteableElement
int newA // TypeElement
) {}
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
// Itearate over all @Factory annotated elements
for (Element annotatedElement : env.getElementsAnnotatedWith(Factory.class)){
...
}
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
// Itearate over all @Factory annotated elements
for (Element annotatedElement : env.getElementsAnnotatedWith(Factory.class)){
if (annotatedElement.getKind() != ElementKind.CLASS) {
messager.printMessage(Diagnostic.Kind.ERROR, “Ooops!”, annotatedElement);
return true;
}
...
}
}
public class FactoryAnnotatedClass {
private TypeElement annotatedClassElement;;
private String simpleTypeName; // Class name
private String id; // “Margherita”
public FactoryAnnotatedClass(TypeElement classElement) throws Exception {
Factory annotation = classElement.getAnnotation(Factory.class);
…
}
}
try {
Class<?> clazz = annotation.type();
qualifiedGroupClassName = clazz.getCanonicalName();
simpleFactoryGroupName = clazz.getSimpleName();
} catch (MirroredTypeException mte) {
DeclaredType classTypeMirror = (DeclaredType) mte.getTypeMirror();
TypeElement classTypeElement = (TypeElement) classTypeMirror.asElement();
qualifiedGroupClassName = classTypeElement.getQualifiedName().toString();
simpleFactoryGroupName = classTypeElement.getSimpleName().toString();
}
public void generateCode(Elements elementUtils, Filer filer) throws IOException {
MethodSpec.Builder method = MethodSpec.methodBuilder("create")
.addModifiers(Modifier.PUBLIC)
.addParameter(String.class, "id")
.returns(TypeName.get(superClassName.asType()));
// Foreach
method.beginControlFlow("if ($S.equals(id))", item.getId())
.addStatement("return new $L()”, item.getTypeElement().getQualifiedName().toString())
.endControlFlow();
TypeSpec typeSpec = TypeSpec.classBuilder(factoryClassName)
.addMethod(method.build()).build();
JavaFile.builder(packageName, typeSpec).build().writeTo(filer);
}
https://github.com/square/javapoet
Processing Rounds
Annotation Processing
A tool build in javac for scanning and
processing annotations at compile time
Dependency Injection
Dagger 2
The fastest Java DI Framework!
https://google.github.io/dagger/
import javax.inject.Inject;
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
Dagger 2
@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {
CoffeeMaker maker();
}
@Module
class DripCoffeeModule {
@Provides static Heater provideHeater() {
return new ElectricHeater();
}
@Provides static Pump providePump(Thermosiphon pump) {
return pump;
}
}
import javax.inject.Inject;
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
Dagger 2
CoffeeShop coffeeShop = DaggerCoffeeShop.create();
Dagger 2
๏ Singletons and Scoped Bindings
๏ Lazy injections
๏ Provider injections
๏ Qualifiers
Dagger 2
The fastest Java DI Framework!
https://google.github.io/dagger/
MapStruct
Bean Mapping at Compile Time
http://mapstruct.org/
public class Car {
private String make;
private int numberOfSeats;
private CarType type;
//constructor, getters, setters etc.
}
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
@Mappings({
@Mapping(source = "make", target = "manufacturer"),
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
}
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
@Mappings({
@Mapping(source = "make", target = "manufacturer"),
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
}
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );
@Mappings({
@Mapping(source = "make", target = "manufacturer"),
@Mapping(source = "numberOfSeats", target = "seatCount")
})
CarDto carToCarDto(Car car);
}
MapStruct
http://mapstruct.org/
๏ Nested mappings
๏ Updating existing bean instances
Retrofit
A type-safe HTTP client for Java
https://square.github.io/retrofit/
Retrofit
public interface WeatherData {
@GET(“weather?”)
Observable<WeatherData> getWeatherData(@Query(“q”) String city);
}
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://api.openweathermap.org/data/2.5/")
.build();
WeatherService weatherService = retrofit.create(WeatherService.class);
Observable<WeatherData> london = weatherService.getWeatherData("Riga");
Retrofit
๏ Header Manipulation
๏ Sync and Asyn calls
๏ Custom Converters
Marvel of Annotation Preprocessing in Java by Alexey Buzdin
Lombok
Spice up your Java
https://projectlombok.org/
@ToString
@ToString(exclude="id")
public class ToStringExample {
private static final int STATIC_VAR = 10;
private String name;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
}
@EqualsAndHashCode
@EqualsAndHashCode(exclude={"id", "shape"})
public class EqualsAndHashCodeExample {
private transient int transientVar = 10;
private String name;
private double score;
private Shape shape = new Square(5, 10);
private String[] tags;
private int id;
}
@RequiredArgsConstructor
@RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class ConstructorExample<T> {
private int x, y;
@NonNull private T description;
@NoArgsConstructor
public static class NoArgsExample {
@NonNull private String field;
}
}
@Data & @Value
@Data
public class PoJo {
private String name;
private double score;
private String[] tags;
private int id;
}
@Value
public class PoJo {
private String name;
private double score;
private String[] tags;
private int id;
}
public String example() {
val example = new ArrayList<String>();
example.add("Hello, World!");
val foo = example.get(0);
return foo.toLowerCase();
}
public String example() {
val example = new ArrayList<String>();
example.add("Hello, World!");
val foo = example.get(0);
return foo.toLowerCase();
}
val !!11one
@ExtensionMethod
class Extensions {
public static String toTitleCase(String in) {
if (in.isEmpty()) return in;
return "" + Character.toTitleCase(in.charAt(0)) +
in.substring(1).toLowerCase();
}
}
@ExtensionMethod({java.util.Arrays.class, Extensions.class})
public class ExtensionMethodExample {
public String test() { return "hELlO, WORlD!”.toTitleCase(); }
}
lombok.fieldDefaults.defaultPrivate = true
Lombok.config
Lombok
Spice up your Java
https://projectlombok.org/
๏@Builder
๏@Log
๏@Delegate
• https://github.com/bluelinelabs/LoganSquare
• https://github.com/greenrobot/EventBus
• … and more
Conclusion
Annotation Processing
Conclusion
Powerful
Fast
Sometimes Brittle
Annotation Processing
Conclusion
Powerful
Fast
Sometimes Brittle
Annotation Processing
Conclusion
Powerful
Fast
Sometimes Brittle
Annotation Processing
Powerful
Fast
Sometimes a Life Saver
Conclusion
Powerful
Fast
Sometimes Brittle
Annotation Processing
“Use it wisely we must!”
Q&A
Thank You!
@AlexeyBuzdinFollow me at

More Related Content

What's hot (19)

PDF
Fullstack End-to-end test automation with Node.js, one year later
Mek Srunyu Stittri
 
PDF
The Gist of React Native
Darren Cruse
 
PDF
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
PDF
Asynchronous Module Definition (AMD)
xMartin12
 
PDF
Refactoring JavaScript Applications
Jovan Vidić
 
PDF
EWD 3 Training Course Part 14: Using Ajax for QEWD Messages
Rob Tweed
 
PDF
vJUG - The JavaFX Ecosystem
Andres Almiray
 
ODP
Javascript training sample
prahalad_das_in
 
PDF
React Native
Craig Jolicoeur
 
PDF
Intro to node.js - Ran Mizrahi (28/8/14)
Ran Mizrahi
 
PDF
Seven Versions of One Web Application
Yakov Fain
 
PDF
The JavaFX Ecosystem
Andres Almiray
 
ODP
Behat Workshop at WeLovePHP
Marcos Quesada
 
PDF
Test Driven Development with JavaFX
Hendrik Ebbers
 
PDF
JavaOne - The JavaFX Community and Ecosystem
Alexander Casall
 
PDF
Painless JavaScript Testing with Jest
Michał Pierzchała
 
PPTX
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
PDF
JavaFX JumpStart @JavaOne 2016
Hendrik Ebbers
 
PDF
JavaFX in Action (devoxx'16)
Alexander Casall
 
Fullstack End-to-end test automation with Node.js, one year later
Mek Srunyu Stittri
 
The Gist of React Native
Darren Cruse
 
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
Asynchronous Module Definition (AMD)
xMartin12
 
Refactoring JavaScript Applications
Jovan Vidić
 
EWD 3 Training Course Part 14: Using Ajax for QEWD Messages
Rob Tweed
 
vJUG - The JavaFX Ecosystem
Andres Almiray
 
Javascript training sample
prahalad_das_in
 
React Native
Craig Jolicoeur
 
Intro to node.js - Ran Mizrahi (28/8/14)
Ran Mizrahi
 
Seven Versions of One Web Application
Yakov Fain
 
The JavaFX Ecosystem
Andres Almiray
 
Behat Workshop at WeLovePHP
Marcos Quesada
 
Test Driven Development with JavaFX
Hendrik Ebbers
 
JavaOne - The JavaFX Community and Ecosystem
Alexander Casall
 
Painless JavaScript Testing with Jest
Michał Pierzchała
 
3 Ways to test your ColdFusion API - 2017 Adobe CF Summit
Ortus Solutions, Corp
 
JavaFX JumpStart @JavaOne 2016
Hendrik Ebbers
 
JavaFX in Action (devoxx'16)
Alexander Casall
 

Similar to Marvel of Annotation Preprocessing in Java by Alexey Buzdin (20)

PDF
Integrating React.js Into a PHP Application
Andrew Rota
 
ZIP
Building Web Apps Sanely - EclipseCon 2010
Chris Ramsdale
 
KEY
Psgi Plack Sfpm
som_nangia
 
KEY
Psgi Plack Sfpm
wilburlo
 
PDF
Middy.js - A powerful Node.js middleware framework for your lambdas​
Luciano Mammino
 
KEY
JBoss World 2010
Chris Ramsdale
 
PDF
SproutCore and the Future of Web Apps
Mike Subelsky
 
KEY
Socket applications
João Moura
 
KEY
Google io bootcamp_2010
Chris Ramsdale
 
ZIP
Google Developer Fest 2010
Chris Ramsdale
 
KEY
Plack perl superglue for web frameworks and servers
Tatsuhiko Miyagawa
 
KEY
Plack at YAPC::NA 2010
Tatsuhiko Miyagawa
 
KEY
Plack - LPW 2009
Tatsuhiko Miyagawa
 
KEY
PSGI/Plack OSDC.TW
Tatsuhiko Miyagawa
 
KEY
Intro to PSGI and Plack
Tatsuhiko Miyagawa
 
PDF
Future of Web Apps: Google Gears
dion
 
PDF
RxSwift to Combine
Bo-Young Park
 
PDF
Workshop: Building Vaadin add-ons
Sami Ekblad
 
PDF
Phone gap 12 things you should know
ISOCHK
 
PDF
Real World Dependency Injection - phpday
Stephan Hochdörfer
 
Integrating React.js Into a PHP Application
Andrew Rota
 
Building Web Apps Sanely - EclipseCon 2010
Chris Ramsdale
 
Psgi Plack Sfpm
som_nangia
 
Psgi Plack Sfpm
wilburlo
 
Middy.js - A powerful Node.js middleware framework for your lambdas​
Luciano Mammino
 
JBoss World 2010
Chris Ramsdale
 
SproutCore and the Future of Web Apps
Mike Subelsky
 
Socket applications
João Moura
 
Google io bootcamp_2010
Chris Ramsdale
 
Google Developer Fest 2010
Chris Ramsdale
 
Plack perl superglue for web frameworks and servers
Tatsuhiko Miyagawa
 
Plack at YAPC::NA 2010
Tatsuhiko Miyagawa
 
Plack - LPW 2009
Tatsuhiko Miyagawa
 
PSGI/Plack OSDC.TW
Tatsuhiko Miyagawa
 
Intro to PSGI and Plack
Tatsuhiko Miyagawa
 
Future of Web Apps: Google Gears
dion
 
RxSwift to Combine
Bo-Young Park
 
Workshop: Building Vaadin add-ons
Sami Ekblad
 
Phone gap 12 things you should know
ISOCHK
 
Real World Dependency Injection - phpday
Stephan Hochdörfer
 
Ad

Recently uploaded (20)

PDF
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
PDF
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
PDF
Enhancing Security in VAST: Towards Static Vulnerability Scanning
ESUG
 
PDF
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
PDF
Virtual Threads in Java: A New Dimension of Scalability and Performance
Tier1 app
 
PPTX
Explanation about Structures in C language.pptx
Veeral Rathod
 
PDF
System Center 2025 vs. 2022; What’s new, what’s next_PDF.pdf
Q-Advise
 
PDF
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
PPTX
Presentation about Database and Database Administrator
abhishekchauhan86963
 
PDF
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
PDF
Why Are More Businesses Choosing Partners Over Freelancers for Salesforce.pdf
Cymetrix Software
 
PPTX
Employee salary prediction using Machine learning Project template.ppt
bhanuk27082004
 
PDF
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 
PDF
Step-by-Step Guide to Install SAP HANA Studio | Complete Installation Tutoria...
SAP Vista, an A L T Z E N Company
 
PDF
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
PPTX
Role Of Python In Programing Language.pptx
jaykoshti048
 
PPTX
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
PDF
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
PDF
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
10 posting ideas for community engagement with AI prompts
Pankaj Taneja
 
MiniTool Power Data Recovery Crack New Pre Activated Version Latest 2025
imang66g
 
Enhancing Security in VAST: Towards Static Vulnerability Scanning
ESUG
 
Applitools Platform Pulse: What's New and What's Coming - July 2025
Applitools
 
Virtual Threads in Java: A New Dimension of Scalability and Performance
Tier1 app
 
Explanation about Structures in C language.pptx
Veeral Rathod
 
System Center 2025 vs. 2022; What’s new, what’s next_PDF.pdf
Q-Advise
 
advancepresentationskillshdhdhhdhdhdhhfhf
jasmenrojas249
 
Presentation about Database and Database Administrator
abhishekchauhan86963
 
How to Download and Install ADT (ABAP Development Tools) for Eclipse IDE | SA...
SAP Vista, an A L T Z E N Company
 
Why Are More Businesses Choosing Partners Over Freelancers for Salesforce.pdf
Cymetrix Software
 
Employee salary prediction using Machine learning Project template.ppt
bhanuk27082004
 
AWS_Agentic_AI_in_Indian_BFSI_A_Strategic_Blueprint_for_Customer.pdf
siddharthnetsavvies
 
Step-by-Step Guide to Install SAP HANA Studio | Complete Installation Tutoria...
SAP Vista, an A L T Z E N Company
 
Salesforce Pricing Update 2025: Impact, Strategy & Smart Cost Optimization wi...
GetOnCRM Solutions
 
Role Of Python In Programing Language.pptx
jaykoshti048
 
GALILEO CRS SYSTEM | GALILEO TRAVEL SOFTWARE
philipnathen82
 
Download iTop VPN Free 6.1.0.5882 Crack Full Activated Pre Latest 2025
imang66g
 
Balancing Resource Capacity and Workloads with OnePlan – Avoid Overloading Te...
OnePlan Solutions
 
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
ESUG
 
Ad

Marvel of Annotation Preprocessing in Java by Alexey Buzdin