java动态代理和静态代理的比较(含代码)

本文介绍了Java中的代理模式,包括静态代理和动态代理两种形式。通过具体示例代码展示了代理模式如何帮助解决接口方法复用的问题,并对比了两种代理方式的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package testdaili;


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


/** 
 * @ClassName: dailitest 
 * @Description: 本篇文章是对代理的复习
 * @author: pgj
 * @date: 2017年10月12日 下午8:36:30  
 */
public class dailitest {



public static void main(String[] args) {
///静态代理
new teacher(new mother()).dosome();
///动态代理
working pro1=(working)new proxyman().getpreoxy(new father());
pro1.dosome();
working2 pro2=(working2)new proxyman().getpreoxy(new father());
pro2.play();
}
}
interface working{

void dosome();
///void speaker();静态代码缺点所在
}
///////////////////////静态代理////////////////////////
///这里是真是类
class mother implements working  {


@Override
public void dosome() {
// TODO Auto-generated method stub

System.out.println("这里是真实类:妈妈指导孩子写作业");
}
}






//这里是代理类:静态代理,对真实进行封装,
class  teacher implements working{
private mother mother;

public teacher(mother mother) {
// TODO Auto-generated constructor stub
this.mother=mother;
}
public void dosome() {
// TODO Auto-generated method stub
    System.out.println("这是代理类:放学后老师叫家长指导学生写作业!");
mother.dosome();
System.out.println("这是代理类:老师批改作业");
}
}
////////////////////动态代理////////////////////
/***
 *动态代理的优点:
 *1.静态代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。
 *如果接口增加一个方法,除了所有实现类需要实现这个方法外,
 *所有代理类也需要实现此方法。增加了代码维护的复杂度,相对而言动态代理只需要实现真是类方法,少了一半。
 *如果增加一个接口
 *2.在静态代理中相较于动态代理,当需要编写大量的代理的时候,编写代理类麻烦了,简而言之,就是动态代理proxyman就像工厂一样,静态代理就像个体户
 *
 *
 */
interface working2{

void play();
}


class father implements working, working2{

@Override
public void dosome() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子玩!");
}


@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("这是真实类:爸爸带孩子打球");
}
}
class proxyman implements InvocationHandler{
private Object object;///真是类


public Object getpreoxy(Object object){
this.object=object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(), this);

   /////实现原理是反射
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("这是动态代理:工厂");
Object sss=method.invoke(object, args);

return sss;
}

}

最后:哎,点赞和评论的人好少啊!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值