jdk动态代理和CGLIB动态代理的区别:
jdk动态代理只能针对实现了接口的目标代理, CGLIB是针对类来实现动态代理,当没有实现接口的类需要代理时,就需要通过CGLIB来实现动态代理。
jdk动态代理:
User.java
public class User { private String uname; private String email; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
UserDao.java
public interface UserDao { @Test public void read(String uname,String email); @Test public void write(String uname,String email); }
UserDaoImpl.java
public class UserDaoImpl implements UserDao { @Override public void read(String uname, String email) { System.out.println("read " + uname + "'s Email is :"+email); } @Override public void write(String uname, String email) { System.out.println("write " + uname + "'s Email is :"+email); } }
UserInvocationHandler.java
public class UserInvocationHandler implements InvocationHandler { private Object obj = null; public UserInvocationHandler(Object obj){ this.obj = obj; } private String getMethodName(Method method){ return method.getName(); } private Annotation[] getAnnotation(Method method){ return method.getAnnotations(); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println(proxy.getClass().getSimpleName()); System.out.println("begin..."); //获取方法名 String methodName = getMethodName(method); System.out.println("方法名称:"+methodName); //获取方法上的注解 Annotation[] annotation = getAnnotation(method); System.out.println("注解名称:"+annotation[0].toString()); result = method.invoke(obj, args); System.out.println("end..."); return result; } }
UserTest.java
public class UserTest { public static void main(String[] args) { UserDao uDao = new UserDaoImpl(); UserInvocationHandler invocationHandler = new UserInvocationHandler(uDao); UserDao proxy = (UserDao) Proxy.newProxyInstance(uDao.getClass().getClassLoader(), uDao.getClass().getInterfaces(), invocationHandler); proxy.write("xuwei", "123@123.com"); proxy.read("xuwei", "123@123.com"); } }
运行结果:
$Proxy0 begin... 方法名称:write 注解名称:@org.junit.Test(expected=class org.junit.Test$None, timeout=0) write xuwei's Email is :123@123.com end... $Proxy0 begin... 方法名称:read 注解名称:@org.junit.Test(expected=class org.junit.Test$None, timeout=0) read xuwei's Email is :123@123.com end...
CGLIB动态代理:
BookDao.java
public interface BookDao { public void create(); public void query(); public void update(); public void delete(); }
BookDaoImpl.java
public class BookDaoImpl implements BookDao{ @Override public void create() { System.out.println("create() is running..."); } @Override public void query() { System.out.println("query() is running..."); } @Override public void update() { System.out.println("update() is running..."); } @Override public void delete() { System.out.println("delete() is running..."); } }
MyCglibProxy.java
public class MyCglibProxy implements MethodInterceptor { public Enhancer enhancer = new Enhancer(); private String name; public MyCglibProxy(String name) { this.name = name; } @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println("调用的方法是:" + method.getName()); // 对用户进行判断 if (!"boss".equals(name)) { System.out.println("你没有权限!"); return null; } Object result = methodProxy.invokeSuper(object, args); return null; } }
MyProxyFilter.java
public class MyProxyFilter implements CallbackFilter { @Override public int accept(Method arg0) { if (!"query".equalsIgnoreCase(arg0.getName())) return 0; return 1; } }
MyCglibProxyFactory.java
public class MyCglibProxyFactory { public static BookDaoImpl getProxyInstance(MyCglibProxy myProxy) { Enhancer en = new Enhancer(); // 进行代理 en.setSuperclass(BookDaoImpl.class); en.setCallback(myProxy); // 生成代理实例 return (BookDaoImpl) en.create(); } public static BookDaoImpl getAuthInstanceByFilter(MyCglibProxy myProxy) { Enhancer en = new Enhancer(); // 进行代理 en.setSuperclass(BookDaoImpl.class); en.setCallbacks(new Callback[]{myProxy,NoOp.INSTANCE}); en.setCallbackFilter(new MyProxyFilter()); // 生成代理实例 return (BookDaoImpl) en.create(); } }
MyCglibClient.java
public class MyCglibClient { public static void main(String[] args) { BookDaoImpl service = MyCglibProxyFactory.getProxyInstance(new MyCglibProxy("boss")); service.create(); BookDaoImpl service2 = MyCglibProxyFactory.getProxyInstance(new MyCglibProxy("john")); service2.create(); BookDaoImpl service3 = MyCglibProxyFactory.getAuthInstanceByFilter(new MyCglibProxy("join")); service3.create(); BookDaoImpl service4 = MyCglibProxyFactory.getAuthInstanceByFilter(new MyCglibProxy("john")); service4.query(); } }
运行结果:
调用的方法是:create create() is running... 调用的方法是:create 你没有权限! 调用的方法是:create 你没有权限! query() is running...
相关推荐
jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压
本压缩文件包含两个项目,用于演示如何输出JDK和CGLib动态代理产生的class文件,欢迎下载!
JDK和CGlib分别实现的动态代理源代码
java静态代理 jdk动态代理 cglib动态代理 代理原理
代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
分别使用jdk和cglib实现动态代理,包含UML图。还有相关的博客链接:http://blog.csdn.net/y_love_f/article/details/46345581.博客中有具体的代理解释
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
java代理机制 JDK动态代理和cglib代理 详解
JDK代理和Cglib代理,下载源码清楚了解二者区别
NULL 博文链接:https://jummy.iteye.com/blog/255628
java动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdf
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
JDK动态代理和Cglib动态代理实例源码
jdk动态代理与cglib动态度代理的区别原理代码jar包
jdk 的动态代理和CGLIB代理
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
java动态代理(JDK和cglib)共10页.pdf.zip