引用包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. t-SNE 聚类

    一个有效的数据降维的方法 t-SNE,类似PCA的主成分降维分析. 参考: t-分布邻域嵌入算法(t-SNE algorithm)简单理解 t-SNE初学 很好的教程:An illustrated i ...

  2. 库: rspec/rspec-expectations matcher匹配器常用

    https://github.com/rspec/rspec-expectations https://relishapp.com/rspec/rspec-expectations/v/3-7/doc ...

  3. spojPlay on Words

    题意:给出几个词语,问能不能接龙. 一开始猜只要所有字母连通,并且只有一个字母出现在开头次数为奇,一个字母末尾为奇,其它偶,就行.后来发现全为偶也行.而且条件也不对,比如ac,ac,ac就不行.实际上 ...

  4. 30 进程process

    进程模块  process Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) ...

  5. zzuli 1432(二进制特点)

      1432: 背包again Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 65 SubmitStatusWeb Board ...

  6. OC MRC之多对象之间管理(代码分析)

    #import <Foundation/Foundation.h> @interface Book : NSObject { int _price; } - (void)setPrice: ...

  7. CentOS搭建“加速器”

    1.安装Shadowsocks 服务端 yum -y update yum install -y python-setuptools && easy_install pip pip i ...

  8. SSH 不分配远程主机tty

    $ host N参数,表示只连接远程主机,不打开远程shell:T参数,表示不为这个连接分配TTY.这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作.

  9. React路由配置使用

    Router包安装: 安装包还是要打开命令行工具,使用npm来进行安装. npm install --save react-router react-router-dom 页面login: impor ...

  10. POJ 1754 线段树

    e,应该是线段树里的水题.线段树单点更新.查询区间最值. 代码套用模板 PS :模板有些地方不太懂. #include<stdio.h>#include<iostream>#i ...