在Java中利用cglib实现代理
在上一篇文章《在Java中利用动态代理实现数据库连接与事务的自动管理》讲述了如何使用Java动态代理,但要求被代理对象要实现一个接口,如果不想实现接口怎么办呢?使用开源的cglib可以实现对一个类对象的代理,而不要求实现接口。
cglib(Code Generation Library)能够在程序运行的时候动态生成接口的实现类和继承于某个类的子类,它是依赖于ASM的,而ASM可以灵活的操作字节码。在http://cglib.sourceforge.net/可以下载cglib.jar,本文选择的是cglib-nodep-2.2.jar,这是一个不依赖其他jar的文件。如果选择cglib-2.2.jar,还需要加入几个依赖的jar包才行,在http://cglib.sourceforge.net/dependencies.html列出来了所需要的jar文件。
在《在Java中利用动态代理实现数据库连接与事务的自动管理》的基础上,我们继续完善框架,使一个没有实现接口的普通类也可以以注解的方式来自动开打数据库连接和事务,当然是通过cglib来实现的。
首先建立方法的拦截器类。代码如下:
package demo.dynamicproxy;
import java.lang.reflect.Method;
import java.sql.Connection;
import demo.dynamicproxy.annotation.Transactional;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Object target;
private IDb db;
public CglibProxy(Object target) {
this.target = target;
this.db = (IDb) target;
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
 
相关文档:
在实际项目中给定一文件夹,得到这个文件夹下所有的文件这样的需求并不是很多,更多的是查找或是删除某一具体的文件
import java.io.File;
import java.util.ArrayList;
public class FileTest {
private static ArrayList<String> filelist = new ArrayList<String>();
public stati ......
public class Path {
//get class absolute address
public String getPath() {
String classPath = getClass().getName();
if (classPath.indexOf(".") != -1) {
classPath = classPath.substring(classPath.lastIndexOf(".") + 1,
......
以O(n)的时间实现对正整数的排序。思路是:从最末位开始,对数组中每一个数的第k位进行计数排序,直到排到最高位为止。
缺点:只能对正整数进行排序,而且需要知道最大整数的最高位,使用范围太小。但这不失为一个很有趣的排序,因为它颠覆了比较排序的传统思路。
public static int[] radixSort(int[] inputs,int d){
......
对于java的网络编程书中讨论的全部归纳起来有Socket的使用,DatagramSocket的使用,java与CGI的配合使用,java连接数据库以及java中调用远程方法。
首先是Socket的使用,对于服务端来说,应该声明的是ServerSocket对象,然后使用Socket
accept()方法进行 ......
我在学习thinking in Java4 的时候,在创建自定义包的时候,碰到了很多错误,让我郁闷了几天,通过在网上的资料搜索,把包的创建过程给大家详细列出来。
我们以thinking in Java4中的例子为例
创建两个类Vector和List。将编译后的Vector.class和List.class文件放在包net.mindview.simple下(该包位于c:\DOC\JavaT).
//Vec ......