在Java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和接口,可以生成JDK动态代理类或动态代理对象。
Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类,如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,
如果需要为一个或多个接口动态的创建实例,也可以使用Proxy来创建动态代理实例。
Proxy提供了如下两个方法,来创建动态代理类和动态代理实例。
getProxyClass(ClassLoader loader, Class<?>... interfaces)
创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口,第一个ClassLoader参数指定生成动态代理类的类加载器。
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
直接创建一个动态代理对象,该代理对象的实现类,实现了interfaces指定的系列接口,执行代理对象的每个方法都会被替换执行InvocationHandler对象的invoke方法。
实际上,即使采用第一个方法获取了一个动态代理类之后,当程序需要通过该代理类,来创建对象时一样,需要传入一个InvocationHandler对象,也就是说,系统生成的每个代理对象都有一个与之关联的的InvocationHandler对象。
代码演示:
package com.qin.aop;
/**
* 通用的模拟AOP
* 切面类,其方法可以在运行时被调入
*
* **/
public class DogUtils {
/**
*
* 第一个拦截器的方法
*
* **/
public void method1(){
System.out.println("=======模拟第一个通用的方法==========");
}
/**
*
* 第一个拦截器的方法
*
* **/
public void method2(){
System.out.println("=======模拟第二个通用的方法==========");
}
}
Dog接口,JDK动态代理只能给接口生成代理。
package com.qin.proxy;
/***
*
* 定义Dog接口
* */
public interface Dog {
/**
*
* 详细信息的方法
* **/
public void info();
/**
* 运行的方法
*
* */
public void run();
}
package com.qin.proxy.impl;
import com.qin.proxy.Dog;
/**
*
* 实现类
* **/
public class GunDog implements Dog {
@Override
public void info() {
System.out.println("我是一只猎狗! ");
}
@Override
public void run() {
System.out.println("我奔跑迅速!");
}
}
package com.qin.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import com.qin.aop.DogUtils;
/**
* 动态代理的实现自定义类
*
*
* **/
public class MyInvokationHandler implements InvocationHandler{
/*
* 需要被代理的对象
* **/
private Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
/**
* 执行动态代理对象的所有方法时,
* 都会被替换成如下的invoke方法
*
* ***/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
DogUtils du=new DogUtils();
//执行DogUtils对象中的method1方法
du.method1();
//以target作为主调来执行method方法
Object result=method.invoke(obj, args);
du.method2();
return result;
}
}
package com.qin.proxy;
import java.lang.reflect.Proxy;
/**
* 该对象为指定的target生成动态代理实例
*
* **/
public class MyProxyFactory {
public static Object getProxy(Object obj){
//创建一个MyInvokationHandler对象
MyInvokationHandler hadler=new MyInvokationHandler();
hadler.setObj(obj);
//创建并返回一个动态代理
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), hadler);
}
}
测试:
package com.qin.test;
import com.qin.proxy.Dog;
import com.qin.proxy.MyProxyFactory;
import com.qin.proxy.impl.GunDog;
/**
*
* 测试驱动类
* **/
public class Test {
public static void main(String[] args) {
Dog target=new GunDog();
Dog dog=(Dog)MyProxyFactory.getProxy(target);
dog.info();
dog.run();
}
}
结果输出如下:
=======模拟第一个通用的方法==========
我是一只猎狗!
=======模拟第二个通用的方法==========
=======模拟第一个通用的方法==========
我奔跑迅速!
=======模拟第二个通用的方法==========
分享到:
相关推荐
java jdk 动态代理 演示demo
java jdk 动态代理演示demo
实现了一份jdk动态代理的demo,做了详细注释,供以后复习使用,另外,这里为什么需要大于100个字节才能传资源?我就不想那么多不行吗???
java代理机制 JDK动态代理和cglib代理 详解
对jdk中的动态代理执行过程进行了详细跟踪,并反编译了动态代理调用自动生成的代理类,并对其进行了详细讲解。
动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
java jdk 动态代理演示demo2 包含将生成的字节码保存到本地
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
java jdk 动态代理用法、资料、demo
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
java静态代理 jdk动态代理 cglib动态代理 代理原理
* * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...
* 动态代理(JDK代理、接口代理、拦截器模式) * 动态代理中的静态方法:java.lang.reflect.Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler(监听处理器)) * * 代码示例:《帮爸爸...
实现java动态代理的两个实例,jdk动态代理和cglib
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
熟悉动态代理的小伙伴都知道,java的动态代理有两个常用的方式,一个是jdk动态代理,一个是cglib,他们两个在使用上的最大区别就是前者是返回一个接口对象(其实质是Proxy类的子类),后者是返回了被代理类的类对象...
java动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdfjava动态代理(JDK和cglib).pdf
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能