引用包cglib-xxx.jar
非Maven项目还需要手动引用包asm-xxx.jar
业务类(不需要定义接口)
cglib代理类(实现接口MethodInterceptor)

异常信息(项目只引用了cglib包,没有引用asm包):

Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:184)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:72)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:72)
at com.wzq.demo02.UserServiceCglib.getInstance(UserServiceCglib.java:15)
at com.wzq.demo02.TestCglib.main(TestCglib.java:6)
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 5 more
FATAL ERROR in native method: JDWP on checking for an array class, jvmtiError=JVMTI_ERROR_WRONG_PHASE(112)
JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on checking for an array class [util.c:1299]

from: https://blog.csdn.net/rain097790/article/details/14168785

public class Person {

    private Integer pid;
private String pnameString; public Person(Integer pid, String pnameString) {
this.pid = pid;
this.pnameString = pnameString;
} public Integer getPid() {
return pid;
} public void setPid(Integer pid) {
this.pid = pid;
} public String getPnameString() {
return pnameString;
} public void setPnameString(String pnameString) {
this.pnameString = pnameString;
}
}
public class Transaction {

    //开启事物
public void beginTransaction(){
System.out.println("--->-非正事(before干正事):--beginTransaction");
}
//提交事物
public void commit(){
System.out.println("--->-非正事(after干正事):--commit");
} }
//此处没有实现PersonDao接口
public class PersonDaoImpl{ public void savePerson() {
System.out.println("--->-正事:--savePerson");
} public List<Person> getPersons() {
List<Person> persons = new ArrayList<>();
Person person1 = new Person(1, "person1");
Person person2 = new Person(2, "person2");
persons.add(person1);
persons.add(person2);
return persons;
} }
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
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 MyInterceptor implements MethodInterceptor {
private Object personDaoImpl; // personDaoImpl // 目标对象
private Transaction transaction; public MyInterceptor(Object personDaoImpl, Transaction transaction) {
super();
System.out.println("=2==构造函数==========================");
this.personDaoImpl = personDaoImpl;
this.transaction = transaction;
} /**
* 产生代理对象
*/
public Object createProxy(){
Enhancer enhancer = new Enhancer();//通过类Enhancer创建代理对象
enhancer.setSuperclass(this.personDaoImpl.getClass());//设置代理对象的父类
enhancer.setCallback(this);//回调函数 拦截器
Object poxyer = enhancer.create();//创建代理对象
System.out.println("-45-->-diy的代理对象(MyInterceptor.class中的diy方法):"+ poxyer);
return poxyer;
} //TODO arg0: 动态生成的代理对象
//TODO method : 实际调用的方法
//TODO arg2: 调用方法入参(当前方法的参数)
//TODO net.sf.cglib.proxy.MethodProxy:java Method类的代理类,可以实现委托类对象的方法的调用;常用方法:methodProxy.invokeSuper(proxy, args);在拦截方法内可以调用多次
@Override
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy proxy) throws Throwable {
System.out.println("=3==进入到了cglibInterceptor的实现方法==========================当前拦截的方法是:"+ method.getName());
//PersonDaoImpl bean = (PersonDaoImpl)personDaoImpl; // 因为在程序里personDaoImpl(targetObject)为PersonServiceBean
if(method.getName().equals("savePerson")){
transaction.beginTransaction();
Object invoke11 = method.invoke(personDaoImpl, arg2); //交给目标对象进行处理 --> poxy调用 目标对象的目标方法("savePerson"方法)
// Object invoke12 = proxy.invoke(arg0, arg2);
transaction.commit();
return null;
}else{ //toString(); getPersons()
Object invoke21 = method.invoke(this.personDaoImpl, arg2);//poxy调用 目标对象的目标方法
// Object invoke22 = proxy.invoke(arg0, arg2);
return invoke21;
} } }
public class PersonDaoImplTest {

    public static void main(String[] args){
PersonDaoImpl personDaoImpl = new PersonDaoImpl();
Transaction transaction = new Transaction();
System.out.println("=1==start prepare==========================");
MyInterceptor interceptor = new MyInterceptor(personDaoImpl, transaction);//创建出能生成 目标代理对象的 Class PersonDaoImpl proxy = (PersonDaoImpl) interceptor.createProxy(); proxy.savePerson(); System.out.println("=21======正事已完成======================");
for(Person person : proxy.getPersons()){
System.out.println("-50-->"+person.getPnameString());
} }
}

结果:

=1==start prepare==========================
=2==构造函数==========================
=3==进入到了cglibInterceptor的实现方法==========================当前拦截的方法是:toString
-45-->-diy的代理对象(MyInterceptor.class中的diy方法):com.wyait.manage.practiceDiy.test3.PersonDaoImpl@2c13da15
=3==进入到了cglibInterceptor的实现方法==========================当前拦截的方法是:savePerson
--->-非正事(before干正事):--beginTransaction
--->-正事:--savePerson
--->-非正事(after干正事):--commit
=21======正事已完成======================
=3==进入到了cglibInterceptor的实现方法==========================当前拦截的方法是:getPersons
-50-->person1
-50-->person2

cglib 简单 代理示例-1的更多相关文章

  1. cglib 多重 代理示例-2

    from:  http://thinkinjava.cn/2018/10/%E4%BD%BF%E7%94%A8-Cglib-%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%87%8D%E ...

  2. cglib代理与jdk动态代理示例

    先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...

  3. Spring源码剖析5:JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  4. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  5. cglib源码分析(四):cglib 动态代理原理分析

    本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...

  6. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  7. cglib动态代理代码示例

    cglib动态代理代码示例 引用包cglib-xxx.jar 非Maven项目还需要手动引用包asm-xxx.jar 业务类(不需要定义接口) cglib代理类(实现接口MethodIntercept ...

  8. aop学习总结二------使用cglib动态代理简单实现aop功能

    aop学习总结二------使用cglib动态代理简单实现aop功能 模拟业务需求: 1.拦截所有业务方法 2.判断用户是否有权限,有权限就允许用户执行业务方法,无权限不允许用户执行业务方法 (判断是 ...

  9. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

随机推荐

  1. 20170729xlVba SSC_RECENT100

    Public Sub Recent100() Dim WebText As String Dim Reg As Object, Mh As Object, OneMh As Object Dim i ...

  2. Jamie and Binary Sequence (changed after round) CodeForces - 916B (贪心)

    链接 大意: 求将n划分为k个2的幂的和, 且最大幂最小,字典序尽量大 比较简单的贪心练习题, 但放在div2的B题感觉偏难了..... 先只考虑最大幂最小, 首先注意到直接按n的二进制划分即可得到最 ...

  3. Leetcode 82

    有个错误就是member access within null pointer of type 'struct ListNode' 其实就是判断了指针是否异常了,比如NULL->next之类.要 ...

  4. iOS UI-(多)视图控制器的生命周期、加载方法和模态视图方法以及屌丝方法

    #import "ViewController.h" #import "SecondViewController.h" @interface ViewContr ...

  5. 以DefaultFuture为例,看类变量初始化顺序

    https://stackoverflow.com/questions/8517121/java-what-is-the-difference-between-init-and-clinit# < ...

  6. jsp 自定义标签库

    自定义标签的作用 *** 自定义标签的主要用于移除jsp页面中java代码 *** JSP页面中使用自定义的标签 使用jsp指令<% @taglib uri="标签库的uri" ...

  7. python--ConfigParser读写改配置文件

    from configparser import ConfigParser fp = 'conf.ini' #定义配置文件名 conf = ConfigParser() #实例化 conf.read( ...

  8. html网页设计

    对于html文档可以直接通过浏览器打开并解释执行,不需要使用服务器.一个html文档的架构,一般由3对标签构成:<html></html>,<head></h ...

  9. hibernate级联 cascade属性(转)

    在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,顾名思义就是级联,也就是说在操作当 前实体时,针对当前实体的操作会影响到相应配置的关联实体.比如针对当前实体进行保存操作 ...

  10. 201621123010《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...