码迷,mamicode.com
首页 > 编程语言 > 详细

java 动态代理示例,带主要注释

时间:2016-09-21 00:02:34      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

Java proxy是基于反射,仅仅支持基于接口的动态代理.

java 动态代理是一切架构的基础,必须了解。 废话少说,先上代码获得感性认识。

示例代码有主要注释.

接口:

public interface Subject {
String hello(String name);
void say();
}

接口实现:
public class ImpSubject implements Subject {
@Override
public String hello(String name){
return String.format("Hello %s", name);
}

@Override
public void say(){
System.out.println(this.getClass().getName());
}
}

动态代理方法调用接口:
//InvocationHandler是自动生成的代理类在调用方法时自动触发的回调接口. 仅仅有一个invocke方法, 可以在这个方法里做各种事情,比如过滤,拦截等等。
public class MyInvocationHandler implements InvocationHandler {
private Subject subject;
public MyInvocationHandler(Subject subject){
this.subject = subject;
}
//object 是代理类实力,method是调用代理实力方法,args是方法参数(无参数则为null)
//可以委托给被代理的实力对象,也可以不委托给被代理对象。
@Override
public Object invoke(Object object, Method method, Object [] args)throws Throwable{

System.out.println(method.getName());
System.out.println(object.getClass().getName());
System.out.println(method.invoke(subject, args));
return Arrays.toString(args);
}
}

客户端测试代码:
public class Main {

public static void main(String[] args) {
Subject subject = new ImpSubject();
InvocationHandler invocationHandler = new MyInvocationHandler(subject);
//Proxy 提供了自动在jvm运行时生成代理类的功能。
原理为:根据第一个参数classloader加载自动生成的代理class, 代理class会自动生成第二个参数提供的所有接口, 在调用代理类方法时,会回调第三个参数Invocationhandler接口, 实现代理.
Subject proxy = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(), new Class<?>[]{Subject.class}, invocationHandler);
System.out.println(proxy.hello("java"));
System.out.println(proxy.getClass().getName());

proxy.say();
}
}

输出:

hello
com.sun.proxy.$Proxy0
Hello java
[java]
com.sun.proxy.$Proxy0
say
com.sun.proxy.$Proxy0
proxy.ImpSubject
null

java 动态代理示例,带主要注释

标签:

原文地址:http://www.cnblogs.com/tulianghui/p/5890967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!