Proxy InvocationHandler 动态代理

1.它是所有动态代理类的父类
2.提供了用于创建动态代理类和动态代理对象的静态方法
如果在程序中为一个或多个接口动态生成实现类,可以使用Proxy来创建动态代理类
public static Class<?> getProxyClass(ClassLoader loader,Class<?>… interfaces)
创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口
第一个ClassLoader参数指定生成动态代理类的类加载器
如果需要为一个或多个接口动态创建实例,也可以使用Proxy来创建动态代理实例
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
创建一个动态代理对象,该代理对象实现了interfaces指定的系列接口,
执行代理对象的每个方法时都会被替换执行InvocationHandler对象中的invoke方法
实际上,即使采用第一个方法生成动态代理类之后,如果程序需用通过该代理类来创建对象,还是需要传入一个
InvocationHandler对象,也就是说,系统生成的每个代理对象都有一个与之关联的InvocationHandler对象
在普通编程中,确实无需使用动态代理,但是在编写框架或底层基础代码时,动态代理的作用就非常大了
练习: 编写一个计算器类,能够统计计算器执行的时间 */
public class ProxyDemo01 {

public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// public static Class<?> getProxyClass(ClassLoader loader,Class<?>… interfaces)
// 动态创建代理类
Class<?> proxyClass = Proxy.getProxyClass(ClassLoader.getSystemClassLoader(), new Class[] {IStar.class});
// 反射创建代理对象
Constructor<?> con = proxyClass.getConstructor(InvocationHandler.class);
InvocationHandler handler = new StarHandler(new LDHStar());
IStar star = (IStar)con.newInstance(handler);
star.sing();
int result = star.calc(10, 20);
System.out.println(result);

System.out.println("---------------------");
// public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
// 通过Proxy动态创建代理对象
IStar proxy = (IStar)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {IStar.class}, new StarHandler(new ZBZStar()) {
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("订票,面谈,签协议");
		if (method.getName().equals("sing")) {
			method.invoke(star, args);
		}
		System.out.println("收尾款");
		return null;
	}
});

proxy.sing();

}
}

class StarHandler implements InvocationHandler {

private IStar star;

// 代理对象调用接口中定义的每一个方法都会导致这里的invoke方法被回调
public StarHandler() {
super();
}

public StarHandler(IStar star) {
super();
this.star = star;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(“订票,面谈,签协议”);
if (method.getName().equals(“sing”)) {
method.invoke(star, args);
}
System.out.println(“收尾款”);
return null;
}
}

interface IStar { void confer(); void signConcact(); void bookTicket(); void sing(); void collectMoney(); int calc(int a, int b); }

class LDHStar implements IStar {

@Override
public void confer() {
System.out.println(“刘德华面谈”);
}

@Override
public void signConcact() {
System.out.println(“刘德华签合同”);
}

@Override
public void bookTicket() {
System.out.println(“刘德华订机票”);
}

@Override
public void sing() {
System.out.println(“刘德华唱歌”);
}

@Override
public void collectMoney() {
System.out.println(“刘德华收钱”);
}

@Override
public int calc(int a, int b) {
return a+b;
}
}

class ZBZStar implements IStar {

@Override
public void confer() {
System.out.println(“张柏芝面谈”);
}

@Override
public void signConcact() {
System.out.println(“张柏芝签合同”);
}

@Override
public void bookTicket() {
System.out.println(“张柏芝订机票”);
}

@Override
public void sing() {
System.out.println(“张柏芝唱歌”);
}

@Override
public void collectMoney() {
System.out.println(“张柏芝收钱”);
}

@Override
public int calc(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值