您的位置:首页 > 编程语言 > Java开发

代理模式-动态代理Demo(JDK自带的动态代理)

2017-10-26 17:40 423 查看
1.说明:借用歌星与经济人(代理)在现实生活中的关系来阐述代理模式;

2.代码

2.1明星接口

public interface Star{
void confer();
void signContract();
void bookTicket();
void sing();
void collectMoney();
}
2.2真实明星实现明星接口

package 代理模式1.动态代理;

public class RealStar implements Star {

@Override
public void confer() {
// TODO Auto-generated method stub
System.out.println("RealStar.confer()");

}

@Override
public void signContract() {
// TODO Auto-generated method stub
System.out.println("RealStar.signContract()");
}

@Override
public void bookTicket() {
// TODO Auto-generated method stub
System.out.println("RealStar.bookTicket()");
}

@Override
public void sing() {
System.out.println("RealStar(周杰伦).sing()");

}

@Override
public void collectMoney() {
// TODO Auto-generated method stub
System.out.println("RealStar.collectMoney()");

}

}


2.3明星助手类实现java.lang.reflect.InvocationHandler接口,重写其public Object invoke(Object proxy, Method method, Object[] args)方法

package 代理模式1.动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StarHandler implements InvocationHandler{
Star realStar;

public StarHandler(Star realStar){
super();
this.realStar = realStar;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object = null;
System.out.println("正真的方法执行前");
if("sing".equals(method.getName())){
object = method.invoke(realStar, args);
}
System.out.println("真正的方法执行后");
return object;
}

}
2.4在Client类中进行调用

package 代理模式1.动态代理;

import java.lang.reflect.Proxy;

public class Client {
public static void main(String[] args) {
Star realStar = new RealStar();
StarHandler  handler = new StarHandler(realStar);
Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler);
//订票
proxy.bookTicket();
//唱歌
proxy.sing();
}
}

3.输出结果:

正真的方法执行前

真正的方法执行后

正真的方法执行前

RealStar(周杰伦).sing()

真正的方法执行后
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: