java动态代理问题:求详解动态代理过程

关于java的动态代理:Proxy类和InvocationHandler接口分别的作用是干什么,求详解?最好能讲下具体的流程,麻烦各位了。... 关于java的动态代理:Proxy类和InvocationHandler接口分别的作用是干什么,求详解?最好能讲下具体的流程,麻烦各位了。 展开
 我来答
puziguo
2013-05-07 · TA获得超过1928个赞
知道小有建树答主
回答量:884
采纳率:86%
帮助的人:794万
展开全部
java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象。

清单 1. Proxy 的静态方法

// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
static InvocationHandler getInvocationHandler(Object proxy)

// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
static Class getProxyClass(ClassLoader loader, Class[] interfaces)

// 方法 3:该方法用于判断指定类对象是否是一个动态代理类
static boolean isProxyClass(Class cl)

// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
static Object newProxyInstance(ClassLoader loader, Class[] interfaces,
InvocationHandler h)

java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。

清单 2. InvocationHandler 的核心方法

// 该方法负责集中处理动态代理类上的所有方法调用。第一个参数既是代理类实例,第二个参数是被调用的方法对象
// 第三个方法是调用参数。调用处理器根据这三个参数进行预处理或分派到委托类实例上发射执行
Object invoke(Object proxy, Method method, Object[] args)

每次生成动态代理类对象时都需要指定一个实现了该接口的调用处理器对象(参见 Proxy 静态方法 4 的第三个参数)。
java.lang.ClassLoader:这是类装载器类,负责将类的字节码装载到 Java
虚拟机(JVM)中并为其定义类对象,然后该类才能被使用。Proxy
静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区别就是其字节码是由 JVM
在运行时动态生成的而非预存在于任何一个 .class 文件中。
每次生成动态代理类对象时都需要指定一个类装载器对象(参见 Proxy 静态方法 4 的第一个参数)

具体信息请参考:
http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html
love爱有缘
2013-05-07 · TA获得超过1041个赞
知道小有建树答主
回答量:789
采纳率:0%
帮助的人:685万
展开全部
**** 代理的目标对象必须实现至少一个接口!!!!
理解动态代理的含义就行了
代理 就是让别人去代替自己完成一些事情。
动态代理 代理实现了目标对象的所有方法,在实现方法的前后去做一些代理需要做的事情,例如日志等
Proxy 就是代理对象,你可以把它当作目标对象的代理人。它能做真实对象所做的事InvocationHandler ,主要用的是里面的方法invoke方法 第一个参数 proxy ,第二个参数method,第三个参数args
1 . 参数 proxy :就是代替真实对象来处理一些事情的,它包含真实对象的所有方法
2 . 参数method : 当前正在处理的方法
3 . 方法中所需要的参数 ,是一个 Object[]类型的数组

而一个对象要想创建代理,则需要
Proxy proxy = Proxy.newProxyInstance(ClassLoader,interface[] , invocation) ;
1 . classloader 需要代理的目标对象的CLassLoader
目标类.getClass().getClassLoader() ;
2 . 代理一个对象,就要实现该对象的所有接口
目标类.getClass().getInterfaces();
3 . 就是所谓的InvocationHandlder 这个是对代理主要进行操作的类,
分析上面的内容后,整个动态代理大致结构为
例如 有一个 学生Student类 里面有两个 方法 study() , sleep(int hour)
现在 我要做一件事,就是在学生调用方法的时候同时记录日志。
示例代码如下:
interface Student{
public void study();
public void sleep(int hour);
}
class StudentImpl implements Student{
public void study(){
System.out.println("I study !!! ");
}
public void sleep(int hour){
System.out.println("I sleep "+hour+"hours every day!");
}
}
在不该动Student类的情况下,进行记录日志。我们可以通过其子类来重写父类方法实现,
但不灵活。此时我们就可以用我们的代理来操作了
创建一个代理工厂
class ProxyFactory{
//提供返回代理的方法
public static Object getProxy(final Object target){ //被代理的目标对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces, new InvocationHandler(){
public Object invoke(Object proxy, Method method , Object[] args){
Object result =null ; //返回的结果
//这里面些具体的操作
/*
该代理工厂根据传递的target不同,代理不同的目标
*/
if(proxy instanceof Student){ //Student代理的时候执行这段代码
System.out.println("log start!!!!"); //方法前执行
result = method.invoke(target,args) ;
System.out.println("log end!!!!"); //方法后执行
return result ;
}else{
return proxy ;
}
}
});
}
}

测试类
public class Test{
public static void main(String[] args){
//返回的Object 实现的Student的所有接口,方法
Student pf = (Student)ProxyFactory.getProxy(new StudentImpl());
pf.study();
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
木星上的程序员
2013-05-07 · TA获得超过476个赞
知道小有建树答主
回答量:602
采纳率:0%
帮助的人:404万
展开全部
首先,被代理对象:target对象,就是你的目标对象。
Proxy接口的对象就是你这个target对象的代理,proxy对象和target对象实现同一个接口。

InvacationHandler就是执行target方法的时候能够进行一些与业务逻辑无关的操作,比如加个日志控制,权限检查等等
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沫神钢虚1F
2017-02-01 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.6万
采纳率:59%
帮助的人:1087万
展开全部
Proxy。newInstance方法是使用ProxyGenerator来动态生成字节码的,生成的是字节码所以没有编译过程。 通过ProxyGenerator生成的字节码代表的类继承了Proxy类
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式