注意:JDK只支持接口的动态代理,不支持类的动态代理
先写一个接口,以Dog为例
package com.lbx.dao;
public interface Dog {
public void info();
public void run();
}
Dog接口的实现
package com.lbx.dao.impl;
import com.lbx.dao.Dog;
public class DogImpl implements Dog {
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println("这是一只狗");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("这只狗在RUN");
}
}
目标代理对象需要在方法前后插入的方法
package com.lbx.interceptor;
public class DogInterceptor {
public void method1(){
System.out.println("第一个拦截方法");
}
public void method2(){
System.out.println("第二个拦截方法");
}
}
关键代码(业务处理)
package com.lbx.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
//需要被代理的目标对象
private Object targer;
//创建拦截器的实例
DogInterceptor di = new DogInterceptor();
//执行代理的目标方法时,此方法自动执行
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(method.getName().equals("info")){
di.method1();
result = method.invoke(targer, args);
di.method2();
}else {
result = method.invoke(targer, args);
}
return result;
}
//用于设置传人目标对象的方法
public void setTarger(Object o){
this.targer = o;
}
}
目标代理对象的工厂
package com.lbx.interceptor;
import java.lang.reflect.Proxy;
import com.lbx.dao.impl.DogImpl;
public class MyProxyFactory {
public static Object getProxy(Object object){
ProxyHandler handler = new ProxyHandler();
handler.setTarger(object);
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),
object.getClass().getInterfaces(), handler);
}
}
测试类
package com.lbx.test;
import com.lbx.dao.Dog;
import com.lbx.dao.impl.DogImpl;
import com.lbx.interceptor.MyProxyFactory;
public class Test {
public static void main(String[] args) {
//先要创建一个需要代理的目标对象
Dog targerObject = new DogImpl();
Dog dog = null;
//创建代理对象
Object proxy = MyProxyFactory.getProxy(targerObject);
if (proxy instanceof Dog) {
dog = (Dog)proxy;
}
dog.info();
dog.run();
}
}
分享到:
相关推荐
Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
CGLIB代理 通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。 那么,如何代理没有实现接口的类? CGLIB代理 CGLIB(Code Generation Library)是一...
基于JDK的动态代理。必须是面向接口的,只有实现了具体接口的类才能生成代理对象
代理模式及手实现动态代理(aop原理)一、代理模式1. 定义2. 示例(1)静态代理(2)动态代理3...代理模式(Proxy Pattern) 是一个使用频率非常高的设计模式,其定义如下: Provide a surrogate or placeholder for an
NULL 博文链接:https://johnyi.iteye.com/blog/385443
用来理解jdk基于接口的动态代理和cglib基于类的代理的区别
里面是自己实现struts拦截器的一个原理,基于jdk的动态代理
第一种是JDK提供的基于接口的动态代理,要求被代理的类必须至少实现一个接口。 2. 第二种是第三方cglib提供的基于子类的动态代理,。至少要继承一个类。 我们这里 来讲解,动态代理,以及第一种实现动态代理的方式 ...
1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 2.cglib封装了asm,可以在运行期动态生成新的class。 3.cglib用于AOP,jdk中的proxy...
Java Jdk 和 Cglib 动态代理 Demo ...2.通过CGLIB基于ASM字节码技术创建动态代理 3.Java 反射原理演示 4.CGLib 依赖如下: <groupId>cglib <artifactId>cglib <version>3.3.0 </dependencies>
Java动态代理的实现 1 程序架构 创建包proxy.jdk,里面包含下面类和接口,详见批注。 类,实现了UserDao接口接口类测试类,包含main方法 类,实现了UserDao接口 接口 类 测试类,包含main方法 2 功能需求 (1) ...
Java毕业设计基于Springboot的休闲娱乐代理售票系统的实现.zipJava毕业设计基于Springboot的休闲娱乐代理售票系统的实现.zipJava毕业设计基于Springboot的休闲娱乐代理售票系统的实现.zipJava毕业设计基于Springboot...
休闲娱乐代理售票-休闲娱乐代理售票系统-休闲娱乐代理售票系统源码-休闲娱乐代理售票管理系统-休闲娱乐代理售票管理系统java代码-休闲娱乐代理售票系统设计与实现-基于springboot的休闲娱乐代理售票系统-基于Web的...
基于ssm的休闲娱乐代理售票系统,Java项目,SpringBoot项目,含开发文档 环境配置: 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea ...
基于springboot的休闲娱乐代理售票系统代码 1、休闲娱乐代理售票系统的技术栈、环境、工具、软件: ① 系统环境:Windows/Mac ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDEA、JDK、...