Этот материал находится в платной подписке. Оформи премиум подписку и смотри или слушай Dynamic Proxies in Java, а также все другие курсы, прямо сейчас!
Премиум
  1. Урок 1. 00:03:06
    0.1. Why I wrote this book (and course)
  2. Урок 2. 00:02:13
    0.2. Hearty welcome
  3. Урок 3. 00:01:24
    0.3. Course author
  4. Урок 4. 00:01:31
    0.4. Comfort and Learning
  5. Урок 5. 00:01:26
    0.5. How to ask questions
  6. Урок 6. 00:01:58
    0.6. Exercises
  7. Урок 7. 00:02:13
    0.7. Exercises in IntelliJ 2020.1 (or later)
  8. Урок 8. 00:02:14
    0.8. History of dynamic proxies
  9. Урок 9. 00:03:11
    0.9. Big Win
  10. Урок 10. 00:01:02
    0.10. Infrastructure Code
  11. Урок 11. 00:03:23
    0.11. Risk of dynamic proxies
  12. Урок 12. 00:01:00
    0.12. What will we learn?
  13. Урок 13. 00:01:18
    0.13. Java version
  14. Урок 14. 00:02:26
    0.14. Shallow vs deep reflection
  15. Урок 15. 00:01:11
    0.15. Book sample code
  16. Урок 16. 00:02:29
    0.16. How code is modularized
  17. Урок 17. 00:00:22
    0.17. Enjoy!
  18. Урок 18. 00:02:14
    0.18. Exercise 0.1
  19. Урок 19. 00:00:37
    1.0. Design Patterns Cousins
  20. Урок 20. 00:02:43
    1.0.1. Christopher Alexander and Design Patterns
  21. Урок 21. 00:03:11
    1.0.2. What's in a name?
  22. Урок 22. 00:01:15
    1.0.3. Four Cousins
  23. Урок 23. 00:01:33
    1.1.1. Proxy Intent
  24. Урок 24. 00:01:21
    1.1.2. Proxy Structure
  25. Урок 25. 00:01:32
    1.1.3. Proxy Variations
  26. Урок 26. 00:01:05
    1.1.4. Proxy Exercises
  27. Урок 27. 00:01:25
    1.2.1. Adapter Intent
  28. Урок 28. 00:02:26
    1.2.2. Adapter Structure
  29. Урок 29. 00:01:32
    1.2.3. Object Adapter vs Proxy
  30. Урок 30. 00:00:24
    1.2.4. Adapter Exercises
  31. Урок 31. 00:03:19
    1.3.1. Decorator Intent
  32. Урок 32. 00:01:19
    1.3.2. Decorator Structure
  33. Урок 33. 00:02:28
    1.3.3. Decorator OutputStream
  34. Урок 34. 00:01:01
    1.3.4. OutputStream Objects
  35. Урок 35. 00:03:25
    1.3.5. OutputStream Code Samples
  36. Урок 36. 00:01:14
    1.3.6. Decorator vs Proxy
  37. Урок 37. 00:00:33
    1.3.7. Decorator Exercises
  38. Урок 38. 00:00:51
    1.4.1. Composite Intent
  39. Урок 39. 00:01:00
    1.4.2. Composite Structure
  40. Урок 40. 00:00:26
    1.4.3. Composite vs Proxy
  41. Урок 41. 00:00:25
    1.4.4. Merging and reducing return values
  42. Урок 42. 00:00:17
    1.4.5. (Ab)using dynamic proxies to implement all four cousins
  43. Урок 43. 00:00:31
    1.4.6. Composite Exercises
  44. Урок 44. 00:00:59
    1.5.1. Chain of Responsibility Intent
  45. Урок 45. 00:02:32
    1.5.2. Chain of Responsibility Sample Code
  46. Урок 46. 00:00:29
    1.5.3. Chain of Responsibility Summary
  47. Урок 47. 00:00:20
    1.5.4. Chain of Responsibility Pitfalls
  48. Урок 48. 00:00:18
    1.5.5. Chain of Responsibility Exercises
  49. Урок 49. 00:01:48
    2. Handcrafted proxies
  50. Урок 50. 00:01:05
    2.1.1. Virtual Proxy
  51. Урок 51. 00:00:35
    2.1.2. CustomMap Interface
  52. Урок 52. 00:01:47
    2.1.3. CustomHashMap Class
  53. Урок 53. 00:01:59
    2.1.4. VirtualCustomMap Class
  54. Урок 54. 00:01:41
    2.1.5. CustomMap Class Diagram
  55. Урок 55. 00:01:48
    2.1.6. Using VirtualCustomMap
  56. Урок 56. 00:01:25
    2.1.7. Sizeof in Java
  57. Урок 57. 00:02:07
    2.2. Remote Proxy
  58. Урок 58. 00:00:42
    2.2.1. RealCanada
  59. Урок 59. 00:01:17
    2.2.2. Spark Framework
  60. Урок 60. 00:00:49
    2.2.3. Service Publisher with Spark
  61. Урок 61. 00:00:49
    2.2.4. Service Publisher with Jetty
  62. Урок 62. 00:02:04
    2.2.5. Remote Proxy CanadianEmbassy
  63. Урок 63. 00:00:45
    2.2.6. Canada Class Diagram
  64. Урок 64. 00:00:29
    2.2.7. Heinz Applying for Canadian Visa
  65. Урок 65. 00:01:25
    2.3. Protection proxy
  66. Урок 66. 00:02:34
    2.3.1. ConcurrentTest for testing thread safety in CustomMap
  67. Урок 67. 00:05:13
    2.3.2. Code walk-through and demo for ConcurrentTest
  68. Урок 68. 00:00:17
    2.3.3. Protection Proxy to the rescue
  69. Урок 69. 00:00:30
    2.3.4. SynchronizedCustomMap
  70. Урок 70. 00:01:50
    2.3.5. Synchronized or ReentrantLock?
  71. Урок 71. 00:00:48
    2.3.6. SynchronizerTestDemo
  72. Урок 72. 00:01:06
    2.3.7. Unmodifiable Map
  73. Урок 73. 00:01:26
    2.3.8. UnmodifiableCustomMap
  74. Урок 74. 00:02:04
    2.3.9. UnsupportedOperationException
  75. Урок 75. 00:00:41
    2.4. Cascaded Proxies
  76. Урок 76. 00:00:28
    2.4.1. More flexible proxy structure
  77. Урок 77. 00:01:15
    2.4.2. Cascading proxies code
  78. Урок 78. 00:01:19
    2.5. equals() in proxies
  79. Урок 79. 00:01:47
    2.5.1. IDE-generated equals() in CustomHashMap
  80. Урок 80. 00:01:10
    2.5.2. How AbstractMap implements equals()
  81. Урок 81. 00:01:59
    2.5.3. New CustomHashMap.equals() method (Broken contract)
  82. Урок 82. 00:00:25
    2.5.4. Proxy's equals() delegates call
  83. Урок 83. 00:02:53
    2.5.5. Correct CustomHashMap.equals()
  84. Урок 84. 00:03:24
    2.6.1. Exercise 2.1. Problem Statement
  85. Урок 85. 00:07:44
    2.6.2. Exercise 2.1. Walkthrough
  86. Урок 86. 00:16:14
    2.6.3. Exercise 2.2. Problem Statement
  87. Урок 87. 00:24:04
    2.6.4. Exercise 2.2. Walkthrough
  88. Урок 88. 00:00:48
    2.7. Summary
  89. Урок 89. 00:00:47
    3. Dynamic Proxies
  90. Урок 90. 00:03:54
    3.0.1. Avoid Copy and Paste
  91. Урок 91. 00:03:56
    3.1. Proxy.newProxyInstance()
  92. Урок 92. 00:00:46
    3.1.1. IllegalArgumentException from Wrong ClassLoader
  93. Урок 93. 00:01:14
    3.1.2. Correct ClassLoader Specified
  94. Урок 94. 00:04:27
    3.1.3. Java Platform Module System
  95. Урок 95. 00:01:39
    3.1.4. InvocationHandler
  96. Урок 96. 00:01:14
    3.2. LoggingInvocationHandler
  97. Урок 97. 00:03:52
    3.2.1. invoke() Method for LoggingInvocationHandler
  98. Урок 98. 00:00:50
    3.2.2. toString() Prints Methods with Args
  99. Урок 99. 00:01:22
    3.2.3. Demo of LoggingInvocationHandler
  100. Урок 100. 00:00:29
    3.3. Dissecting a Dynamic Proxy
  101. Урок 101. 00:01:04
    3.3.1. Dynamic Proxy Class Name
  102. Урок 102. 00:00:49
    3.3.2. Decompiling $Proxy0
  103. Урок 103. 00:06:42
    3.3.3. $Proxy0 Code Walkthrough
  104. Урок 104. 00:01:30
    3.3.4. How Does $Proxy0 Work?
  105. Урок 105. 00:04:46
    3.3.5. EscapeAnalysisTest of Arguments Array
  106. Урок 106. 00:01:42
    3.3.6. Turbo-boosting Reflection Methods
  107. Урок 107. 00:06:28
    3.3.6.1. TurboBoosterTest Demo
  108. Урок 108. 00:02:03
    3.3.6.2. MethodTurboBooster Code Review
  109. Урок 109. 00:00:16
    3.4. Recasted Exceptions
  110. Урок 110. 00:00:31
    3.4.1. Unexpected Exceptions Causing Issues
  111. Урок 111. 00:01:32
    3.4.2. RecastingExceptionsBroken
  112. Урок 112. 00:01:31
    3.4.3. Unwrapping InvocationHandler
  113. Урок 113. 00:00:27
    3.4.4. RecastingExceptionsFixed
  114. Урок 114. 00:01:02
    3.5. Proxies Facade
  115. Урок 115. 00:01:17
    3.5.1. Proxies.castProxy()
  116. Урок 116. 00:00:54
    3.5.2. simpleProxy()
  117. Урок 117. 00:00:51
    3.5.3. RealISODateParser
  118. Урок 118. 00:01:18
    3.5.4. Using Proxies Facade
  119. Урок 119. 00:01:05
    3.6. Virtual Dynamic Proxy
  120. Урок 120. 00:00:27
    3.6.1. Proxies Facade virtualProxy()
  121. Урок 121. 00:01:09
    3.6.2. Creating Virtual Proxy
  122. Урок 122. 00:01:25
    3.6.3. Company and MoralFibre
  123. Урок 123. 00:01:00
    3.6.4. CompanyTest
  124. Урок 124. 00:01:03
    3.7. Synchronized Dynamic Proxy
  125. Урок 125. 00:00:18
    3.7.1. Proxies Facade synchronizedProxy()
  126. Урок 126. 00:00:52
    3.7.2. SynchronizedTest
  127. Урок 127. 00:01:13
    3.8. Cascading Dynamic Proxies
  128. Урок 128. 00:01:58
    3.9. EnhancedStream
  129. Урок 129. 00:01:43
    3.9.1. EnhancedStream Code Review
  130. Урок 130. 00:00:29
    3.10. Dynamic Proxy Restrictions
  131. Урок 131. 00:00:37
    3.10.1. Interfaces Only
  132. Урок 132. 00:00:33
    3.10.2. UndeclaredThrowableException
  133. Урок 133. 00:00:59
    3.10.3. Return Types Have to be Correct
  134. Урок 134. 00:01:33
    3.10.4. Naming Mysteries
  135. Урок 135. 00:00:40
    3.10.5. Deeper Call Stacks
  136. Урок 136. 00:01:48
    3.10.6. Shared Proxy Classes
  137. Урок 137. 00:03:01
    3.11. Performance
  138. Урок 138. 00:04:06
    3.11.1. Model for Benchmark using JMH
  139. Урок 139. 00:01:38
    3.11.2. Benchmark increment() Results
  140. Урок 140. 00:00:51
    3.11.3. Benchmark consumeCPU() Results
  141. Урок 141. 00:00:41
    3.11.4. Summary of Benchmark Results
  142. Урок 142. 00:00:16
    3.12. Exercises
  143. Урок 143. 00:00:25
    3.12.1. Exercises 3.1. Problem Statement
  144. Урок 144. 00:01:31
    3.12.2. Exercises 3.1. Walkthrough
  145. Урок 145. 00:02:14
    3.12.3. Exercises 3.2. Problem Statement
  146. Урок 146. 00:08:32
    3.12.4. Exercises 3.2. Walkthrough
  147. Урок 147. 00:00:37
    4. Dynamic Decorator
  148. Урок 148. 00:00:37
    4.0. Decorator Structure
  149. Урок 149. 00:02:54
    4.1. Filtering for Immutability
  150. Урок 150. 00:01:15
    4.1.1. ImmutableCollection
  151. Урок 151. 00:01:05
    4.1.2. HandcodedFilter
  152. Урок 152. 00:00:23
    4.1.3. MutableCollection
  153. Урок 153. 00:01:05
    4.1.4. UML Diagram
  154. Урок 154. 00:01:45
    4.1.5. HandcodedFilter Demo
  155. Урок 155. 00:04:53
    4.2. FilterHandler
  156. Урок 156. 00:04:55
    4.2.1. FilterHandler Class
  157. Урок 157. 00:01:44
    4.2.2. Proxies Facade Gets filter() Method
  158. Урок 158. 00:01:08
    4.2.3. Dynamic Filter Demo
  159. Урок 159. 00:02:25
    4.2.4. What Happened?
  160. Урок 160. 00:00:45
    4.3. VTable
  161. Урок 161. 00:02:06
    4.3.1. VTable Overview
  162. Урок 162. 00:04:49
    4.3.2. ParameterTypesFetcher
  163. Урок 163. 00:04:53
    4.3.3. MethodKey
  164. Урок 164. 00:03:58
    4.3.4. VTable
  165. Урок 165. 00:07:39
    4.3.4.1. VTable put() and findIndex()
  166. Урок 166. 00:03:31
    4.3.4.2. VTable.getDefaultMethodHandle()
  167. Урок 167. 00:00:58
    4.3.4.3. Turbo-Boosting Methods in VTable
  168. Урок 168. 00:03:41
    4.3.4.4. VTable.lookup() and stream()
  169. Урок 169. 00:19:04
    4.3.5. VTable.Builder
  170. Урок 170. 00:01:40
    4.3.6. VTables Facade
  171. Урок 171. 00:00:23
    4.3.7. VTable Summary
  172. Урок 172. 00:05:42
    4.4. ChainedInvocationHandler
  173. Урок 173. 00:00:45
    4.4.1. UnhandledMethodException
  174. Урок 174. 00:01:49
    4.4.2. VTableHandler
  175. Урок 175. 00:01:32
    4.4.3. VTableDefaultMethodHandler
  176. Урок 176. 00:05:35
    4.4.4. UnifiedInvocationHandler
  177. Урок 177. 00:00:49
    4.5.1. Exercise 4.1. Problem Statement
  178. Урок 178. 00:02:12
    4.5.2. Exercise 4.1. Walkthrough
  179. Урок 179. 00:03:33
    4.5.3. Exercise 4.2. Problem Statement
  180. Урок 180. 00:13:31
    4.5.4. Exercise 4.2. Walkthrough
  181. Урок 181. 00:00:31
    5. Dynamic Object Adapter
  182. Урок 182. 00:01:00
    5.0.1. Singer and Rapper
  183. Урок 183. 00:01:13
    5.0.2. Class Adapter
  184. Урок 184. 00:01:22
    5.0.3. Object Adapter
  185. Урок 185. 00:00:13
    5.1. Better Collections
  186. Урок 186. 00:02:32
    5.1.1.1. Generics Type Erasure
  187. Урок 187. 00:02:18
    5.1.1.2. Demo of ArrayList
  188. Урок 188. 00:02:45
    5.1.1.3. Covariant Return Types
  189. Урок 189. 00:01:34
    5.1.2.1. BetterArrayList
  190. Урок 190. 00:01:01
    5.1.2.2. Demo of BetterArrayList
  191. Урок 191. 00:01:25
    5.1.3.1. BetterCollection Interface
  192. Урок 192. 00:00:35
    5.1.3.2. BetterConcurrentSkipListSet
  193. Урок 193. 00:01:17
    5.1.4.1. Object Adapter Pattern
  194. Урок 194. 00:01:24
    5.1.4.2. BetterCollectionObjectAdapter
  195. Урок 195. 00:00:25
    5.1.4.3. Demo of BetterCollectionObjectAdapter
  196. Урок 196. 00:00:52
    5.1.4.4. What if we want to make a better Set, List, etc.?
  197. Урок 197. 00:01:54
    5.1.5.1. ObjectAdapterHandler
  198. Урок 198. 00:01:44
    5.1.5.2. Proxies.adapt()
  199. Урок 199. 00:02:23
    5.1.5.3. BetterCollectionFactory
  200. Урок 200. 00:01:16
    5.1.5.4. Demo of Dynamic Object Adapter
  201. Урок 201. 00:01:10
    5.2.1. Dynamic Object Adapter Restrictions
  202. Урок 202. 00:03:46
    5.2.2. AdapterPuzzle1
  203. Урок 203. 00:01:08
    5.2.3. AdapterPuzzle2
  204. Урок 204. 00:00:29
    5.3. Performance
  205. Урок 205. 00:01:38
    5.3.1. Benchmark
  206. Урок 206. 00:02:30
    5.3.2. JMH Benchmark Code
  207. Урок 207. 00:01:10
    5.3.3. Benchmark size() Results
  208. Урок 208. 00:01:00
    5.3.4. Benchmark toArray() Results
  209. Урок 209. 00:01:49
    5.3.5. Benchmark forEachFiltered() Results
  210. Урок 210. 00:01:52
    5.4.1. Exercise 5.1. Problem Statement
  211. Урок 211. 00:05:22
    5.4.2. Exercise 5.1. Walkthrough
  212. Урок 212. 00:01:17
    5.4.3. Exercise 5.2. Problem Statement
  213. Урок 213. 00:05:48
    5.4.4. Exercise 5.2. Walkthrough
  214. Урок 214. 00:01:25
    5.4.5. Exercise 5.3. Problem Statement
  215. Урок 215. 00:11:08
    5.4.6. Exercise 5.3. Walkthrough
  216. Урок 216. 00:03:22
    6. Dynamic Composite
  217. Урок 217. 00:01:13
    6.0.1. Composite Structure
  218. Урок 218. 00:01:07
    6.0.2. Visitor Pattern
  219. Урок 219. 00:05:33
    6.0.3. add() and remove() in Component?
  220. Урок 220. 00:03:02
    6.1. Mailing List
  221. Урок 221. 00:00:56
    6.1.1. Contact and Person
  222. Урок 222. 00:01:37
    6.1.2. DistributionList
  223. Урок 223. 00:01:19
    6.1.3. Contact Class Diagram
  224. Урок 224. 00:01:13
    6.1.4. Let's Build a Mailing List
  225. Урок 225. 00:00:29
    6.1.5. Mailing List Object Graph
  226. Урок 226. 00:00:35
    6.1.6. Composite Classes Look Similar
  227. Урок 227. 00:00:52
    6.1.7. BaseComponent
  228. Урок 228. 00:00:25
    6.1.8. Contact extends BaseComponent
  229. Урок 229. 00:00:49
    6.1.9. BaseComponent Class Diagram
  230. Урок 230. 00:00:54
    6.2. CompositeHandler
  231. Урок 231. 00:01:48
    6.2.1. CompositeHandler Constructor
  232. Урок 232. 00:01:22
    6.2.2. Matching add() and remove() methods
  233. Урок 233. 00:01:43
    6.2.3. requiresAllInterfaces()
  234. Урок 234. 00:07:03
    6.2.4. addChildMethods()
  235. Урок 235. 00:01:09
    6.2.5. UncheckedException
  236. Урок 236. 00:02:10
    6.2.6. mapFunction()
  237. Урок 237. 00:03:01
    6.2.7. map and reduce
  238. Урок 238. 00:00:45
    6.2.8. Reducer.PROXY_INSTANCE_REDUCER
  239. Урок 239. 00:00:29
    6.2.9. Merging final result and unwrapping UncheckedException
  240. Урок 240. 00:00:14
    6.2.10. CompositeHandler summary
  241. Урок 241. 00:01:11
    6.2.11. Proxies.compose()
  242. Урок 242. 00:00:57
    6.2.12. Dynamic Composite Contact
  243. Урок 243. 00:01:16
    6.3. TeeAppendables
  244. Урок 244. 00:00:53
    6.3.1. Demo of TeeOutputStream
  245. Урок 245. 00:00:27
    6.3.2. OutputStreamComposite
  246. Урок 246. 00:02:25
    6.3.3. Interfaces of OutputStream and Writer
  247. Урок 247. 00:01:40
    6.3.4. TeeAppendable Handwritten Composite
  248. Урок 248. 00:01:02
    6.3.5. Making TeeAppendable into Writer
  249. Урок 249. 00:02:28
    6.3.6. Demo of TeeAppendable
  250. Урок 250. 00:01:45
    6.4. AppendableFlushableCloseable
  251. Урок 251. 00:00:59
    6.4.1. Composing Appendable Dynamically
  252. Урок 252. 00:02:19
    6.5.1. Exercise 6.1. Problem Statement
  253. Урок 253. 00:09:45
    6.5.2. Exercise 6.1. Walkthrough
  254. Урок 254. 00:00:43
    6.5.3. Exercise 6.2. Problem Statement
  255. Урок 255. 00:03:23
    6.5.4. Exercise 6.2. Walkthrough
  256. Урок 256. 00:04:57
    7. Conclusion