Dynamic Proxies in Java by Dr Heinz M. Kabutz
Sale Page : -/-
Description:
Of all the things that we could learn this month, why dynamic proxies?
Back in 1996, we could learn the entire Java ecosystem in a week with Bruce Eckel’s “Thinking in Java”.
Fast-forward to 2020 and the volume of information is overwhelming.
Java is still quite easy to learn, especially if we focus on the most essential tools. Start with the syntax, then object-orientation, flow control, collections and Java 8 streams. Design patterns hold everything together.
But there is more, much more.
To become a true Java Specialist, we need to also master the underpinnings of this great platform. How else can we develop systems that take advantage of the power of Java?
Dynamic proxies are such a tool. We can save thousands of lines of repetitive code with a single class. By taking a thorough look at how they work, we will recognize good use cases for them in our systems.
Dynamic proxies are not an everyday tool. They may come in handy only half a dozen times in our career. But when they fit, they save us an incredible amount of effort. I once managed to replace over half a million code statements with a single dynamic proxy. Powerful stuff.
This course is for intermediate to advanced Java programmers who want to get to “guru” status. It is not suitable for beginners in Java.
Every section has tough exercises for us to solve, together with walkthroughs.
We hope you enjoy this course as much as I enjoyed creating it for you!
Let the dynamic proxy games begin!
Heinz
Course Curriculum
Resources
Start
Exercise files and slides
Start
Dynamic Proxies in Java Mini-Book
Start
Playground files and solved exercises
Welcome
Preview
0.1. Why I wrote this book (and course) (3:05)
Preview
0.2. Hearty welcome (2:12)
Preview
0.3. Course author (1:23)
Preview
0.4. Comfort and Learning (1:30)
Preview
0.5. How to ask questions (1:25)
Preview
0.6. Exercises (1:57)
Preview
0.7. Exercises in IntelliJ 2020.1 (or later) (2:12)
Preview
0.8. History of dynamic proxies (2:13)
Preview
0.9. Big Win (3:10)
Preview
0.10. Infrastructure Code (1:01)
Preview
0.11. Risk of dynamic proxies (3:22)
Preview
0.12. What will we learn? (0:59)
Preview
0.13. Java version (1:17)
Preview
0.14. Shallow vs deep reflection (2:25)
Preview
0.15. Book sample code (1:10)
Preview
0.16. How code is modularized (2:28)
Preview
0.17. Enjoy! (0:21)
Preview
0.18. Exercise 0.1 (2:13)
Design Patterns Cousins
Preview
1.0. Design Patterns Cousins (0:36)
Preview
1.0.1. Christopher Alexander and Design Patterns (2:42)
Preview
1.0.2. What’s in a name? (3:10)
Preview
1.0.3. Four Cousins (1:14)
Preview
1.1.1. Proxy Intent (1:32)
Preview
1.1.2. Proxy Structure (1:20)
Preview
1.1.3. Proxy Variations (1:31)
Preview
1.1.4. Proxy Exercises (1:04)
Preview
1.2.1. Adapter Intent (1:24)
Preview
1.2.2. Adapter Structure (2:25)
Preview
1.2.3. Object Adapter vs Proxy (1:31)
Preview
1.2.4. Adapter Exercises (0:23)
Preview
1.3.1. Decorator Intent (3:18)
Preview
1.3.2. Decorator Structure (1:18)
Preview
1.3.3. Decorator OutputStream (2:27)
Preview
1.3.4. OutputStream Objects (1:00)
Preview
1.3.5. OutputStream Code Samples (3:24)
Preview
1.3.6. Decorator vs Proxy (1:13)
Preview
1.3.7. Decorator Exercises (0:32)
Preview
1.4.1. Composite Intent (0:50)
Preview
1.4.2. Composite Structure (0:59)
Preview
1.4.3. Composite vs Proxy (0:25)
Preview
1.4.4. Merging and reducing return values (0:24)
Preview
1.4.5. (Ab)using dynamic proxies to implement all four cousins (0:16)
Preview
1.4.6. Composite Exercises (0:30)
Preview
1.5.1. Chain of Responsibility Intent (0:58)
Preview
1.5.2. Chain of Responsibility Sample Code (2:31)
Preview
1.5.3. Chain of Responsibility Summary (0:28)
Preview
1.5.4. Chain of Responsibility Pitfalls (0:19)
Preview
1.5.5. Chain of Responsibility Exercises (0:17)
Handcrafted Proxies
Start
2. Handcrafted proxies (1:47)
Start
2.1.1. Virtual Proxy (1:04)
Start
2.1.2. CustomMap Interface (0:34)
Start
2.1.3. CustomHashMap Class (1:46)
Start
2.1.4. VirtualCustomMap Class (1:58)
Start
2.1.5. CustomMap Class Diagram (1:40)
Start
2.1.6. Using VirtualCustomMap (1:47)
Start
2.1.7. Sizeof in Java (1:24)
Start
2.2. Remote Proxy (2:06)
Start
2.2.1. RealCanada (0:41)
Start
2.2.2. Spark Framework (1:16)
Start
2.2.3. Service Publisher with Spark (0:48)
Start
2.2.4. Service Publisher with Jetty (0:48)
Start
2.2.5. Remote Proxy CanadianEmbassy (2:03)
Start
2.2.6. Canada Class Diagram (0:44)
Start
2.2.7. Heinz Applying for Canadian Visa (0:28)
Start
2.3. Protection proxy (1:24)
Start
2.3.1. ConcurrentTest for testing thread safety in CustomMap (2:33)
Start
2.3.2. Code walk-through and demo for ConcurrentTest (5:12)
Start
2.3.3. Protection Proxy to the rescue (0:16)
Start
2.3.4. SynchronizedCustomMap (0:29)
Start
2.3.5. Synchronized or ReentrantLock? (1:49)
Start
2.3.6. SynchronizerTestDemo (0:47)
Start
2.3.7. Unmodifiable Map (1:05)
Start
2.3.8. UnmodifiableCustomMap (1:25)
Start
2.3.9. UnsupportedOperationException (2:03)
Start
2.4. Cascaded Proxies (0:40)
Start
2.4.1. More flexible proxy structure (0:27)
Start
2.4.2. Cascading proxies code (1:14)
Start
2.5. equals() in proxies (1:18)
Start
2.5.1. IDE-generated equals() in CustomHashMap (1:46)
Start
2.5.2. How AbstractMap implements equals() (1:09)
Start
2.5.3. New CustomHashMap.equals() method (Broken contract) (1:58)
Start
2.5.4. Proxy’s equals() delegates call (0:24)
Start
2.5.5. Correct CustomHashMap.equals() (2:52)
Start
2.6.1. Exercise 2.1. Problem Statement (3:23)
Start
2.6.2. Exercise 2.1. Walkthrough (7:43)
Start
2.6.3. Exercise 2.2. Problem Statement (16:13)
Start
2.6.4. Exercise 2.2. Walkthrough (24:03)
Start
2.7. Summary (0:47)
Dynamic Proxies
Start
3. Dynamic Proxies (0:46)
Start
3.0.1. Avoid Copy and Paste (3:53)
Start
3.1. Proxy.newProxyInstance() (3:55)
Start
3.1.1. IllegalArgumentException from Wrong ClassLoader (0:45)
Start
3.1.2. Correct ClassLoader Specified (1:13)
Start
3.1.3. Java Platform Module System (4:26)
Start
3.1.4. InvocationHandler (1:38)
Start
3.2. LoggingInvocationHandler (1:13)
Start
3.2.1. invoke() Method for LoggingInvocationHandler (3:51)
Start
3.2.2. toString() Prints Methods with Args (0:49)
Start
3.2.3. Demo of LoggingInvocationHandler (1:21)
Start
3.3. Dissecting a Dynamic Proxy (0:28)
Start
3.3.1. Dynamic Proxy Class Name (1:03)
Start
3.3.2. Decompiling $Proxy0 (0:48)
Start
3.3.3. $Proxy0 Code Walkthrough (6:41)
Start
3.3.4. How Does $Proxy0 Work? (1:29)
Start
3.3.5. EscapeAnalysisTest of Arguments Array (4:45)
Start
3.3.6. Turbo-boosting Reflection Methods (1:41)
Start
3.3.6.1. TurboBoosterTest Demo (6:27)
Start
3.3.6.2. MethodTurboBooster Code Review (2:02)
Start
3.4. Recasted Exceptions (0:15)
Start
3.4.1. Unexpected Exceptions Causing Issues (0:30)
Start
3.4.2. RecastingExceptionsBroken (1:31)
Start
3.4.3. Unwrapping InvocationHandler (1:30)
Start
3.4.4. RecastingExceptionsFixed (0:26)
Start
3.5. Proxies Facade (1:01)
Start
3.5.1. Proxies.castProxy() (1:16)
Start
3.5.2. simpleProxy() (0:53)
Start
3.5.3. RealISODateParser (0:50)
Start
3.5.4. Using Proxies Facade (1:17)
Start
3.6. Virtual Dynamic Proxy (1:04)
Start
3.6.1. Proxies Facade virtualProxy() (0:26)
Start
3.6.2. Creating Virtual Proxy (1:08)
Start
3.6.3. Company and MoralFibre (1:24)
Start
3.6.4. CompanyTest (0:59)
Start
3.7. Synchronized Dynamic Proxy (1:02)
Start
3.7.1. Proxies Facade synchronizedProxy() (0:17)
Start
3.7.2. SynchronizedTest (0:51)
Start
3.8. Cascading Dynamic Proxies (1:12)
Start
3.9. EnhancedStream (1:57)
Start
3.9.1. EnhancedStream Code Review (1:42)
Start
3.10. Dynamic Proxy Restrictions (0:28)
Start
3.10.1. Interfaces Only (0:36)
Start
3.10.2. UndeclaredThrowableException (0:32)
Start
3.10.3. Return Types Have to be Correct (0:58)
Start
3.10.4. Naming Mysteries (1:33)
Start
3.10.5. Deeper Call Stacks (0:39)
Start
3.10.5.1. Leaky Abstractions (1:59)
Start
3.10.6. Shared Proxy Classes (1:47)
Start
3.11. Performance (3:00)
Start
3.11.1. Model for Benchmark using JMH (4:05)
Start
3.11.2. Benchmark increment() Results (1:37)
Start
3.11.3. Benchmark consumeCPU() Results (0:50)
Start
3.11.4. Summary of Benchmark Results (0:40)
Start
3.12. Exercises (0:15)
Start
3.12.1. Exercises 3.1. Problem Statement (0:24)
Start
3.12.2. Exercises 3.1. Walkthrough (1:30)
Start
3.12.3. Exercises 3.2. Problem Statement (2:13)
Start
3.12.4. Exercises 3.2. Walkthrough (8:31)
Dynamic Decorators
Start
4. Dynamic Decorator (0:36)
Start
4.0. Decorator Structure (0:36)
Start
4.1. Filtering for Immutability (2:53)
Start
4.1.1. ImmutableCollection (1:14)
Start
4.1.2. HandcodedFilter (1:04)
Start
4.1.3. MutableCollection (0:22)
Start
4.1.4. UML Diagram (1:04)
Start
4.1.5. HandcodedFilter Demo (1:44)
Start
4.2. FilterHandler (4:52)
Start
4.2.1. FilterHandler Class (4:54)
Start
4.2.2. Proxies Facade Gets filter() Method (1:43)
Start
4.2.3. Dynamic Filter Demo (1:07)
Start
4.2.4. What Happened? (2:24)
Start
4.3. VTable (0:44)
Start
4.3.1. VTable Overview (2:05)
Start
4.3.2. ParameterTypesFetcher (4:48)
Start
4.3.3. MethodKey (4:52)
Start
4.3.4. VTable (3:57)
Start
4.3.4.1. VTable put() and findIndex() (7:38)
Start
4.3.4.2. VTable.getDefaultMethodHandle() (6:08)
Start
4.3.4.3. Turbo-Boosting Methods in VTable (0:57)
Start
4.3.4.4. VTable.lookup() and stream() (3:41)
Start
4.3.5. VTable.Builder (19:03)
Start
4.3.6. VTables Facade (1:39)
Start
4.3.7. VTable Summary (0:22)
Start
4.4. ChainedInvocationHandler (5:41)
Start
4.4.1. UnhandledMethodException (0:44)
Start
4.4.2. VTableHandler (1:48)
Start
4.4.3. VTableDefaultMethodHandler (3:39)
Start
4.4.4. UnifiedInvocationHandler (6:37)
Start
4.5.1. Exercise 4.1. Problem Statement (0:48)
Start
4.5.2. Exercise 4.1. Walkthrough (2:11)
Start
4.5.3. Exercise 4.2. Problem Statement (3:32)
Start
4.5.4. Exercise 4.2. Walkthrough (13:30)
Dynamic Object Adapter
Start
5. Dynamic Object Adapter (0:30)
Start
5.0.1. Singer and Rapper (0:59)
Start
5.0.2. Class Adapter (1:12)
Start
5.0.3. Object Adapter (1:21)
Start
5.1. Better Collections (0:12)
Start
5.1.1.1. Generics Type Erasure (2:31)
Start
5.1.1.2. Demo of ArrayList (2:17)
Start
5.1.1.3. Covariant Return Types (2:44)
Start
5.1.2.1. BetterArrayList (1:33)
Start
5.1.2.2. Demo of BetterArrayList (1:00)
Start
5.1.3.1. BetterCollection Interface (1:24)
Start
5.1.3.2. BetterConcurrentSkipListSet (0:34)
Start
5.1.4.1. Object Adapter Pattern (1:16)
Start
5.1.4.2. BetterCollectionObjectAdapter (1:23)
Start
5.1.4.3. Demo of BetterCollectionObjectAdapter (0:24)
Start
5.1.4.4. What if we want to make a better Set, List, etc.? (0:51)
Start
5.1.5.1. ObjectAdapterHandler (1:53)
Start
5.1.5.2. Proxies.adapt() (1:43)
Start
5.1.5.3. BetterCollectionFactory (2:22)
Start
5.1.5.4. Demo of Dynamic Object Adapter (1:15)
Start
5.2.1. Dynamic Object Adapter Restrictions (1:09)
Start
5.2.2. AdapterPuzzle1 (3:45)
Start
5.2.3. AdapterPuzzle2 (1:07)
Start
5.3. Performance (0:28)
Start
5.3.1. Benchmark (3:19)
Start
5.3.2. JMH Benchmark Code (6:21)
Start
5.3.3. Benchmark size() Results (3:14)
Start
5.3.4. Benchmark toArray() Results (4:26)
Start
5.3.5. Benchmark forEachFiltered() Results (6:22)
Start
5.4.1. Exercise 5.1. Problem Statement (1:51)
Start
5.4.2. Exercise 5.1. Walkthrough (5:21)
Start
5.4.3. Exercise 5.2. Problem Statement (1:16)
Start
5.4.4. Exercise 5.2. Walkthrough (5:47)
Start
5.4.5. Exercise 5.3. Problem Statement (1:24)
Start
5.4.6. Exercise 5.3. Walkthrough (11:07)
Dynamic Composite
Start
6. Dynamic Composite (3:21)
Start
6.0.1. Composite Structure (1:12)
Start
6.0.2. Visitor Pattern (1:06)
Start
6.0.3. add() and remove() in Component? (5:32)
Start
6.1. Mailing List (3:01)
Start
6.1.1. Contact and Person (0:55)
Start
6.1.2. DistributionList (1:36)
Start
6.1.3. Contact Class Diagram (1:18)
Start
6.1.4. Let’s Build a Mailing List (1:12)
Start
6.1.5. Mailing List Object Graph (0:28)
Start
6.1.6. Composite Classes Look Similar (0:34)
Start
6.1.7. BaseComponent (0:51)
Start
6.1.8. Contact extends BaseComponent (0:24)
Start
6.1.9. BaseComponent Class Diagram (0:48)
Start
6.2. CompositeHandler (0:53)
Start
6.2.1. CompositeHandler Constructor (1:47)
Start
6.2.2. Matching add() and remove() methods (1:09)
Start
6.2.3. requiresAllInterfaces() (1:42)
Start
6.2.4. addChildMethods() (7:02)
Start
6.2.5. UncheckedException (1:08)
Start
6.2.6. mapFunction() (2:09)
Start
6.2.7. map and reduce (3:53)
Start
6.2.8. Reducer.PROXY_INSTANCE_REDUCER (0:44)
Start
6.2.9. Merging final result and unwrapping UncheckedException (0:28)
Start
6.2.10. CompositeHandler summary (0:13)
Start
6.2.11. Proxies.compose() (1:10)
Start
6.2.12. Dynamic Composite Contact (0:56)
Start
6.3. TeeAppendables (1:15)
Start
6.3.1. Demo of TeeOutputStream (0:52)
Start
6.3.2. OutputStreamComposite (0:26)
Start
6.3.3. Interfaces of OutputStream and Writer (2:24)
Start
6.3.4. TeeAppendable Handwritten Composite (1:39)
Start
6.3.5. Making TeeAppendable into Writer (1:01)
Start
6.3.6. Demo of TeeAppendable (2:27)
Start
6.4. AppendableFlushableCloseable (1:44)
Start
6.4.1. Composing Appendable Dynamically (0:58)
Start
6.5.1. Exercise 6.1. Problem Statement (2:18)
Start
6.5.2. Exercise 6.1. Walkthrough (9:44)
Start
6.5.3. Exercise 6.2. Problem Statement (0:42)
Start
6.5.4. Exercise 6.2. Walkthrough (3:22)
Conclusion
Start
7. Conclusion (4:56)
Your Instructor
Dr Heinz M. Kabutz
Heinz Kabutz is the author of The Java Specialists’ Newsletter, a publication enjoyed by tens of thousands of Java experts in over 145 countries. His book “Dynamic Proxies (in German)” was #1 Bestseller on Amazon.de in Fachbücher für Informatik for about five minutes until Amazon fixed their algorithm. Thanks to a supportive mother, he has now sold 5 copies.
Heinz’s Java Specialists’ newsletter is filled with amusing anecdotes of life on the Island of Crete. He is a popular speaker at all the best Java conferences around the world, and also at some of the worst. He teaches Java courses in classrooms around the world, where his prime objective is to make absolutely sure that none of his students fall asleep. He is not always successful.
Frequently Asked Questions
How long do I have access to a fully paid course?
How does lifetime access sound? After enrolling, you have unlimited access to this course for as long as you like – across any and all devices you own. Furthermore, if we move to another platform, we will offer you a free transfer of your account for all the courses that you have purchased.
How long do I have access to a “Limited Access” course?
Each “Limited Access” course has a time limit after which you lose access to the course material. The time is enough for a focused student to finish the entire course.
What is the difference between a subscription, paying in installments and an outright purchase?
With a subscription, you never own the rights to the material. If your card is declined or you cancel your subscription, you lose access to the course. The money you have paid so far is lost. Paying in installments is a bit better. You pay for 5 or 10 months and then once you have completed your installments you have lifetime access to the course. The safest is an outright purchase, where you pay the entire course in one amount. There is no risk of losing access.
Can I pay via PayPal?
Yes, you can for outright purchases, but not for recurring payments such as paying by installments or subscriptions.
Can I get an EU VAT Invoice?
Absolutely. First off, be sure to enter the VAT number in the appropriate field during the payment process. Then contact us for an EU VAT Invoice. Please tell us the receipt number for which you need the invoice.
May I share my login details with my colleagues?
Unfortunately not. The terms of usage are for a single license. Teachable tracks your progress through the curriculum, so you won’t know how much you have watched. We offer a 30% discount on 50 licenses or more by one company. Please contact us for bulk licensing.
May we use the course for running in-house courses?
You may, as long as each of the students in the class has a valid license for that course. For example, a lot of companies run lunch time Design Patterns study groups using our material. This is an effective way to learn. Please contact us for bulk licensing.
What if I am unhappy with the course?
We would never want you to be unhappy! If you are unsatisfied with your purchase, contact us in the first 30 days and we will give you a full refund and deregister you from the course.
When does the course start and finish?
The course starts now and never ends! It is a completely self-paced online course – you decide when you start and when you finish. We do recommend putting time aside and setting goals to complete the course.
Can I watch the course offline during my commute?
Teachable have an iOS app that lets you watch offline. Android is not supported unfortunately.
Business online course
Information about business:
Business is the activity of making one’s living or making money by producing or buying and selling products (such as goods and services).
[need quotation to verify] Simply put, it is “any activity or enterprise entered into for profit.
It does not mean it is a company, a corporation, partnership, or have any such formal organization, but it can range from a street peddler to General Motors.”
Having a business name does not separate the business entity from the owner, which means that the owner of the business is responsible and liable for debts incurred by the business.
If the business acquires debts, the creditors can go after the owner’s personal possessions.
A business structure does not allow for corporate tax rates. The proprietor is personally taxed on all income from the business.
Please kindly contact us if you need proof of item.
Find out more Business & Marketing Courses at here !!!
Allen Reinger PhD –
Rec’d promptly. Just what I wanted. Thank you. | Dynamic Proxies in Java by Dr Heinz M. Kabutz