Java中两种动态代理的实现

本文介绍了java中两种动态代理的实现方法,Spring的动态代理也是基于这两种方法的。直接附上源码:

1、JDK实现

使用JDK实现动态代理必须使用接口

  • 接口Work.java


public interface Work {
public void work();
}

  • 实现类WorkImpl.java


public class WorkImpl implements Work {

@Override
public void work() {
System.out.println("我在工作");
}

}

  • 一个添加日志的代理类LogHandler.java,这里用到了log4j。


public class LogHandler<T> implements InvocationHandler{

public T target;

private static Logger logger = Logger.getLogger(LogHandler.class);

public LogHandler(T target){
this.target = target;
}

@SuppressWarnings("unchecked")
public T getInstance(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
logger.warn("start");
Object result = method.invoke(target, args);
logger.warn("end");
return result;
}

}

  • 最后测试类Test.java


public class Test {
public static void main(String[] args) {
Work w = new WorkImpl();
w.work();
Work logWork = new LogHandler<Work>(w).getInstance();
logWork.work();
}
}

2、CGLIB实现

CGLIB实现动态代理是对JDK动态代理的一种补充,可以不实现接口就能动态代理。

首先需要引入CGLIB的相关jar包(cglib-nodep-2.2.2.jar)

  • 业务相关类WorkImpl.java


public class WorkImpl   {

public void work() {
System.out.println("我在工作");
}

}

  • CGLIB动态代理类LogHandler.java,同样是添加日志信息


public class LogHandler<T> implements MethodInterceptor{

public T target;

private static Logger logger = Logger.getLogger(LogHandler.class);

public LogHandler(T target){
this.target = target;
}

@SuppressWarnings("unchecked")
public T getInstance(){
//使用CGLIB生成子类,并委托代理对象代理
return (T) Enhancer.create(target.getClass(), this);
}

@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
logger.warn("start!");
Object result=proxy.invokeSuper(obj, args);
logger.warn("end!");
return result;
}

}

  • 测试类Test.java


public class Test {
public static void main(String[] args) {
WorkImpl w = new WorkImpl();
w.work();
WorkImpl logWork = new LogHandler<WorkImpl>(w).getInstance();
logWork.work();
}
}

Java中两种动态代理的实现

时间: 2024-07-30 18:12:29

Java中两种动态代理的实现的相关文章

JAVA 中两种判断输入的是否是数字的方法__正则化_

JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengzehua_test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { System.out.println("请输入第一个数字:"

java中两种添加监听器的策略

/*第一种:将事件的处理委托给其他对象,下面的例子是委托给了MyListener(implements ActionListener)*/ 1 import java.applet.Applet; 2 import java.awt.event.*; 3 import java.awt.*; 4 public class ChangeColor extends Applet{//Applet的默认布局为FlowLayout方式 5 Color myColor; 6 String str; 7 B

Java中两种实现多线程方式的对比分析

本文转载自:http://www.linuxidc.com/Linux/2013-12/93690.htm#0-tsina-1-14812-397232819ff9a47a7b7e80a40613cfe1 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析.我们用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线

Spring的两种动态代理:Jdk和Cglib 的区别和实现

一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用

Java中两种获取Stream流的方式

获取流 java.util.stream.Stream<T> 是Java 8新加入的最常用的流接口.(这并不是一个函数式接口.) 获取一个流非常简单,有以下几种常用的方式: 所有的 Collection 集合都可以通过 stream 默认方法获取流; Stream 接口的静态方法 of 可以获取数组对应的流. 根据Collection获取流 首先, java.util.Collection 接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流. import j

java反射机制与动态代理

在学习HadoopRPC时,用到了函数调用,函数调用都是采用的java的反射机制和动态代理来实现的,所以现在回顾下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机制是java程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射就是把Java类中的各种成分映射成相应的Java类. Java反射机制主要提供了以下功能: 1

学习Spring必学的Java基础知识(2)----动态代理

学习Spring必学的Java基础知识(2)----动态代理 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www

Java中13种设计模式汇总

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

Spring中的JDK动态代理

Spring中的JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术. JDK的动态代理主要涉及Java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.而Proxy为Invo