Java代理模式
2016-04-15 14:44
405 查看
一静态代理:
当无法访问一个对象或者访问一个对象有困难的时候可以为这个对象提供一个代理,代理者与被代理者应该实现相同的接口,或者继承同一个抽象类。
被代理者:
需要实现相同的接口或者继承相同的抽象类:
main 方法实现:
我们可以理解为一个学生他不想学习,把读书的工作还有写书的工作都交给老师,让老师来做。 虽然在Java代码中我们可以通过静态代理模式实现,但是在现实中....嘿嘿嘿
二动态代理:
我们发现每个代理都需要一个代理类,这样的话类越多代码量越大,重复的行为也很多,这时候就用到了动态代理模式。
在Java代码中提供了一个InvocationHandler接口,需要实现invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler{
private Object object;
public Object bind(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 {
Object result = null;
result=method.invoke(object, args);
return result;
}
}
在main方法中调用:
public class School {
public static void main(String[] args) {
Student student=new Student();
DynamicProxy proxy=new DynamicProxy();
Study study=(Study)proxy.bind(student);
study.read();
study.write();
}
}
Java通过反射机制得到一个动态代理,这个时候就不需要静态代理的Teacher类,这个时候通过动态代理的反射机制形成一个Study接口类。
当无法访问一个对象或者访问一个对象有困难的时候可以为这个对象提供一个代理,代理者与被代理者应该实现相同的接口,或者继承同一个抽象类。
被代理者:
public class Student implements Study{ @Override public void read() { System.out.print("read a book"); } @Override public void write() { System.out.print("write a book"); } }代理者:
public class Teacher implements Study{ private Student student; public Teacher(Student student) { this.student=student; } @Override public void read() { student.read(); } @Override public void write() { student.write(); } }
需要实现相同的接口或者继承相同的抽象类:
public interface Study { void read(); void write(); }
main 方法实现:
public class School { public static void main(String[] args) { Student student=new Student(); Teacher teacher=new Teacher(student); teacher.read(); teacher.write(); } }
我们可以理解为一个学生他不想学习,把读书的工作还有写书的工作都交给老师,让老师来做。 虽然在Java代码中我们可以通过静态代理模式实现,但是在现实中....嘿嘿嘿
二动态代理:
我们发现每个代理都需要一个代理类,这样的话类越多代码量越大,重复的行为也很多,这时候就用到了动态代理模式。
在Java代码中提供了一个InvocationHandler接口,需要实现invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler{
private Object object;
public Object bind(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 {
Object result = null;
result=method.invoke(object, args);
return result;
}
}
在main方法中调用:
public class School {
public static void main(String[] args) {
Student student=new Student();
DynamicProxy proxy=new DynamicProxy();
Study study=(Study)proxy.bind(student);
study.read();
study.write();
}
}
Java通过反射机制得到一个动态代理,这个时候就不需要静态代理的Teacher类,这个时候通过动态代理的反射机制形成一个Study接口类。
相关文章推荐
- Spring Mvc - 用户注册服务端生成默认头像实现
- MAVEN工程的构建与命令使用
- spring AOP动态代理使用和配置方式(手打)
- java不定长参数的简单使用
- 浅谈Java开发中的代理模式
- Java 父类,子类各自均有构造器和静态代码块 执行的顺序
- spring知识点积累
- 关于J2EE/EJB/Spring
- javah的使用常见错误
- Java中GC的工作原理详解
- java 判断对象是否为String类型
- 【Spring实战】—— 5 设值注入
- java File类的基本使用方法总结
- netbeans许可证模板设置
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 在powerdesigner 中出现Could not Initialize JavaVM! 应该怎么解决
- J2SE(八)Java之对象的序列化与反序列化
- Spring 声明式事务使用
- struts2.xml的自带校验的使用
- intelIJ配置javaweb服务器