引用包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. English trip -- VC(情景课)2 A At school

    xu言: Sometimes, I feel very confused. However, there will always be a weak light in a corner to ligh ...

  2. 改变进程的优先级,nice,getpriority,setpriority

    int getpriority(int which, int who);返回一组进程的优先级 参数which和who确定返回哪一组进程的优先级 The value which is one of PR ...

  3. HMM模型和Viterbi算法

    https://www.cnblogs.com/Denise-hzf/p/6612212.html 一.隐含马尔可夫模型(Hidden Markov Model) 1.简介 隐含马尔可夫模型并不是俄罗 ...

  4. sgu 130Circle dp

    130. Circle time limit per test: 0.25 sec. memory limit per test: 4096 KB On a circle border there a ...

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

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

  6. Android Studio 常用快捷键大全

    鉴于使用AndroidStudio进行Android 开发的人越来越多,笔者整理了一些常用的快捷键.方便读者查阅,提高开发效率.

  7. Maven中使用Jetty容器

    1.在pom.xml中添加Jetty的插件 <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId ...

  8. vsftp服务器同步文件

    首先vsftp同步文件,并没有好的解决方案,网上有一些软件是可以定时同步文件的,我是用的是linux上的一款工具Rsync 首先先了解一下Rsync与scp的区别:点我 1.安装Rsync 两种安装方 ...

  9. Python 编程核心知识体系-文件对象|错误处理(四)

    错误处理 文件对象

  10. 玩转X-CTR100 l STM32F4 l HC-SR04超声波测距

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 超声波测距模块HC-SR04可以测量2cm~40 ...