目前流行的AOP编程以及方法拦截其实本质就是通过在不改变原有类的前提下,通过代理来对当前访问的方法进行拦截,并接着做后续的工作,
通过有两种方式
1. 利用jdk的代理
2.引入CGLIB的第三方字节码解析jar,实现代理
区别:
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
jdk代理的例子:
转载于
http://www.blogjava.net/hadeslee/archive/2007/09/08/143641.html
『下面我们就来认识一下,代理的主要类:java.lang.reflect.Proxy
它定义了一套静态方法,供我们使用,其中一个最常用的方法就是生成代理对象
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
它根据你传入的类加载器和这个代理将会实现的接口,以及一个调用处理器,来生成一个代理对象.说起来比较抽象,还是给点例子吧:
先声明一个接口,用来调用代理的方法
/*
* MyInterface.java
*
* Created on 2007年9月8日, 下午4:38
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package test4;
/**
*
* @author hadeslee
*/
public interface MyInterface {
public void sayHello(String s);
public void doSth();
}
然后再写一个类实现此方法
/*
* Test1.java
*
* Created on 2007年9月8日, 下午4:31
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package test4;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author hadeslee
*/
public class Test1 implements MyInterface{
/** Creates a new instance of Test1 */
public Test1() {
}
public static void main(String[] args) throws Exception{
Test1 list=new Test1();
MyInterface my=(MyInterface)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
list.getClass().getInterfaces(),
new MyHandler<MyInterface>(list));
System.out.println("my.name="+my.getClass().getName());
my.doSth();
my.sayHello("千里冰封");
}
//接口中的方法
public void sayHello(String s) {
System.out.println("sayHello to:"+s);
}
//接口中的方法
public void doSth() {
System.out.println("doSth()");
}
//一个静态内部类,实现了InvocationHandler的接口,
//它也是一个关键的接口,所有代理后的行为都是在这里实现的
static class MyHandler<T> implements InvocationHandler{
private T t;
public MyHandler(T t){
this.t=t;
}
//实现方法调用
//可以自己加上自己的一些调用,此例中只是在加上了一个输出
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我知道马上要被调用的方法是:"+method.getName());
return method.invoke(t,args);
}
}
}
运行上面的类输出是:
my.name=$Proxy0
我知道马上要被调用的方法是:doSth
doSth()
我知道马上要被调用的方法是:sayHello
sayHello to:千里冰封
从这里可以看出,代理的类的名字换成了$Proxy0,其中$Proxy是所有代理类的类名前缀
我们在调用doSth()和sayHello()的时候,都调用到了我们在代理中设置的输出.如果你想在这里代理别的类,也是可以的,只要你符合以上的调用规律.
最后特别要注意的一点是:
//实现方法调用
//可以自己加上自己的一些调用,此例中只是在加上了一个输出
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我知道马上要被调用的方法是:"+method.getName());
return method.invoke(t,args);
}
在上面的实现中,千万不能调用method.invoke(proxy,args).因为proxy本身就是一个代理的对象,你如果再在它上面调用一个方法的话,会无限递归的调用这个方法,所以,在InvocationHandler的实现里面,最好是传一个代理对象的真正实现进去,这样就可以还原本来的调用结果,并加上自己的东西在里面.
』
CGLIB方式:
http://cglib.sourceforge.net/howto.html
分享到:
相关推荐
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
在"JAVA私塾笔记整理——反射机制(Reflection)"这份文档中,我们将深入探讨反射机制的基础知识、用途和实现方式。 1. **反射机制的基本概念** 反射机制是Java提供的一种能够在运行时分析类和对象的能力。它允许...
对于Java SE中的高级特性,例如反射、注解、动态代理等,笔记可能也会有详细讲解。这些特性使得Java具备了强大的元编程能力,可以用于实现许多复杂的设计模式。 除此之外,如果这份笔记还包含Java EE部分,那么Web...
本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...
3. **异常处理**:Java的异常处理机制是其强大的特性之一,学习笔记会讲解如何使用try-catch-finally语句块来捕获和处理程序运行时可能出现的错误。 4. **集合框架**:Java集合框架是存储和操作对象的重要工具,...
Java入门笔记文档详细阐述了Java编程语言的基本概念、开发工具、编程基础、面向对象编程、多线程、集合框架、IO流、网络编程、安全加密、反射机制、新特性、内存管理等多个方面,为初学者提供了一条通往Java编程世界...
7. **反射机制**:Java的反射机制允许程序在运行时动态地获取类的信息并操作类的对象,这是许多高级功能(如插件系统、序列化、动态代理等)的基础。 8. **泛型**:泛型引入了类型参数,增强了代码的类型安全性,...
7. **高级特性**:这可能包括反射、动态代理、注解、JVM内存模型、垃圾回收机制、设计模式等。这些内容可以帮助开发者更好地理解和优化Java程序的性能。 每个PDF部分都应包含详细的实例和练习,以帮助读者巩固理论...
8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等高级功能至关重要。 9. **JNI(Java Native Interface)**:当JAVA代码需要调用本地(C/C++)代码时,JNI...
对于Java的高级特性,笔记会涵盖反射、动态代理、注解和模块系统。反射允许程序在运行时检查类的信息并操控它们,动态代理可以实现AOP(面向切面编程),注解则提供了一种元数据的方式,而模块系统(Jigsaw)则有助...
* 动态代理:通过反射机制,可以创建动态代理对象,以实现 AOP(Aspect-Oriented Programming)编程。 ### Java 反射机制的优缺点 优点: * 灵活性高:Java 反射机制允许程序在运行时检查和修改自身的结构和行为...
Java JDK 6学习笔记是Java开发者入门和进阶的重要参考资料,由知名作者林信良编著。本笔记主要涵盖了JDK 6版本的核心特性和关键概念,为读者提供了全面而深入的学习路径。以下是对其中重要知识点的详细阐述: 1. **...
2. **动态代理**:允许在运行时创建代理类,用于实现动态的AOP(面向切面编程)和回调机制。 3. **增强的JDBC**:提升了数据库访问性能,简化了SQL语句的执行。 4. **NIO(非阻塞I/O)**:提高了网络编程的效率,...
Java动态代理主要由`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口组成,它们提供了一种机制,可以在运行时创建一个实现了特定接口的新类,这个新类的实例可以作为这些接口的代理,以处理...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和...对于"面试笔记"这个文件,它很可能包含了以上所有领域的详细解答和实例,是准备Java面试的宝贵资料。通过深入学习和实践,可以显著提高面试成功率。
Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...
在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...
3. **异常处理**:Java中的异常处理机制允许程序员捕获并处理运行时错误,提高程序的健壮性。了解如何使用try-catch-finally语句块和异常类是必不可少的。 4. **集合框架**:Java集合框架包括接口(如List、Set、...
"Java笔记"通常会涵盖Java的核心概念和技术,这些内容对于初学者和经验丰富的开发者都是宝贵的资源。这里我们将深入探讨Java的一些关键知识点。 1. **Java基础**: Java的基础包括语法、数据类型、变量、运算符、...
《王者归来之经典-Java编程思想读书笔记》会介绍如何有效地使用异常处理机制,防止程序因未预期的错误而崩溃。 函数和方法是代码复用的关键。Java支持方法重载和重写,这使得代码更加灵活且易于维护。书中会详细...