1、静态代理
package staticProxy; public interface Person { public void say(); } package staticProxy; public class Chinese implements Person { public void say() { System.out.println("I am chinese."); } } package staticProxy; public class ChineseProxy implements Person { private Chinese chinese; public ChineseProxy(Chinese chinese) { this.chinese = chinese; } public void say() { System.out.println("Before say..."); chinese.say(); System.out.println("After say..."); } } package staticProxy; public class Test { public static void main(String[] args) { Chinese chinese = new Chinese(); Person p = new ChineseProxy(chinese); p.say(); } }
输出:Before say...
I am chinese.
After say...
2、JDK动态代理
package dynamicProxy; public interface Person { public void say(); } package dynamicProxy; public class Chinese implements Person { public void say() { System.out.println("I am chinese."); } } package dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public Object bind(Object target) { this.target = target; // 取得代理对象 // 必须绑定接口,对于没有实现接口的类无法使用,cglib会弥补这个不足 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { Object result = null; System.out.println("Before say..."); result = arg1.invoke(target, arg2); System.out.println("After say..."); return result; } } package dynamicProxy; public class Test { public static void main(String[] args) { Chinese chinese = new Chinese(); Person p = (Person) new DynamicProxy().bind(chinese); p.say(); } }
输出:Before say...
I am chinese.
After say...
3、CGLIB实现的动态代理,不需要实现接口
需要使用委托类的派生出子类,因此,不支持final修饰的最终类
package cglibProxy; public class Chinese{ public void say() { System.out.println("I am chinese."); } public void eat() { System.out.println("Eating..."); } } package cglibProxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class CglibProxy implements MethodInterceptor { private Object target; public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("Before say..."); arg3.invokeSuper(arg0, arg2); System.out.println("After say..."); return null; } } package cglibProxy; public class Test { public static void main(String[] args) { Chinese chinese = (Chinese) new CglibProxy().getInstance(new Chinese()); chinese.say(); chinese.eat(); } }
输出:Before say...
I am chinese.
After say...
Before say...
Eating...
After say...
相关推荐
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
达内是一家知名的教育机构,其整理的Java笔记通常会覆盖从基础到进阶的各种主题,以系统化的方式帮助学员掌握这门广泛使用的编程语言。 首先,Java的基础知识是必不可少的,这些笔记可能包括变量、数据类型、运算符...
"Java笔记"通常会涵盖Java的核心概念和技术,这些内容对于初学者和经验丰富的开发者都是宝贵的资源。这里我们将深入探讨Java的一些关键知识点。 1. **Java基础**: Java的基础包括语法、数据类型、变量、运算符、...
以上内容是Java笔记中的核心部分,涵盖了从基础知识到进阶技术的多个层面。通过系统学习和实践,可以帮助开发者扎实地掌握Java编程,并具备解决实际问题的能力。在不断更新的技术环境中,Java依然保持着旺盛的生命力...
8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等高级功能至关重要。 9. **JNI(Java Native Interface)**:当JAVA代码需要调用本地(C/C++)代码时,JNI...
3. **异常处理**:Java的异常处理机制是其强大的特性之一,学习笔记会讲解如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,...
《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...
这份《Java学习笔记》包含了丰富的知识内容,旨在帮助学习者全面掌握Java编程技术。笔记分为7个PDF部分,覆盖了从基础到高级的Java编程概念。 1. **Java基础知识**:这部分内容通常包括Java的历史背景、环境配置、...
Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...
【Java全套笔记】JavaEE(上)是一套全面的Java后端开发学习资料,涵盖了从基础到进阶的多个主题,旨在帮助开发者深入理解和掌握JavaEE技术栈。这份笔记集合了多个关键知识点,包括设计模式、开发工具的使用、实战...
对于Java的高级特性,笔记会涵盖反射、动态代理、注解和模块系统。反射允许程序在运行时检查类的信息并操控它们,动态代理可以实现AOP(面向切面编程),注解则提供了一种元数据的方式,而模块系统(Jigsaw)则有助...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
这是Java开发者需要具备的核心知识之一,因为不当的内存管理可能会导致内存泄漏等问题。 整体来看,这份Java入门笔记是一份非常详尽的参考资料,适合初学者和有一定基础的开发者深入学习Java语言及其相关技术。通过...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和...对于"面试笔记"这个文件,它很可能包含了以上所有领域的详细解答和实例,是准备Java面试的宝贵资料。通过深入学习和实践,可以显著提高面试成功率。
### JAVA上课笔记class_10:观察者模式与适配器模式详解 #### 观察者模式(Observer Pattern) 在Java编程中,观察者模式是一种常用的设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时...
Java JDK 6学习笔记是Java开发者入门和进阶的重要参考资料,由知名作者林信良编著。本笔记主要涵盖了JDK 6版本的核心特性和关键概念,为读者提供了全面而深入的学习路径。以下是对其中重要知识点的详细阐述: 1. **...
在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...
【良葛格Java学习笔记】 本笔记主要涵盖了Java编程语言的核心概念和技术,旨在帮助初学者以及有一定基础的开发者深入理解并掌握Java。Java作为一种广泛应用于企业级应用开发、移动开发(尤其是Android)以及大数据...
这份"个人Java学习过程中所有学习笔记"包含了作者在学习Java时积累的宝贵经验,旨在帮助初学者或有经验的程序员巩固基础,提升技能。 笔记内容可能涵盖以下几个主要部分: 1. **Java基础**:这部分通常包括Java的...
这篇学习笔记主要关注动态代理部分,虽然没有提供具体的压缩包文件内容,但根据标题和描述,我们可以深入探讨这两个概念。 **反射(Reflection)** 反射是Java语言的一个强大工具,它允许程序在运行时检查类、接口...