java动态代理和静态代理的比较(含代码)
来源:互联网 发布:linux 连不上外网 编辑:程序博客网 时间:2024/06/08 16:37
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;
}
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;
}
}
最后:哎,点赞和评论的人好少啊!
阅读全文
0 0
- java动态代理和静态代理的比较(含代码)
- 动态代理和静态代理的比较
- java的代理模式(动态代理和静态代理)
- Java静态代理和动态代理的简单代码实现。
- java的静态代理和动态代理
- Java 的静态代理和动态代理
- java的动态代理和静态代理
- Java的静态代理和动态代理
- Java的静态代理和动态代理
- java的代理模式(静态和动态代理)
- Java的代理(Proxy)-静态代理和动态代理
- JAVA的静态代理与动态代理比较
- JAVA的静态代理与动态代理比较
- JAVA的静态代理与动态代理比较--转载
- JAVA的静态代理与动态代理比较
- JAVA的静态代理与动态代理比较--转载
- JAVA的静态代理与动态代理比较
- JAVA的静态代理与动态代理比较
- hdoj 5573 Binary Tree
- nginx 集群系列
- 近期要完成的东西
- 使用Eclipse下CDT插件的配置,代码编写,debug全流程指南
- 汉字编码及显示原理总结
- java动态代理和静态代理的比较(含代码)
- java词频统计
- wireshark工具使用详解以及Tcp三次握手抓包解析
- 信号与槽的新语法(Qt5)
- Java标准教程:Java 2D绘图--第4章 使用Text API
- StreamReader和StreamWriter 的使用
- 如何制作手机自适应网页
- 2016算法第一次练习赛——B 朴素的中位数
- vim常见命令