java 中的代理
来源:互联网 发布:易语言仓库管理源码 编辑:程序博客网 时间:2024/05/21 17:58
java中的代理分为两种,
1,静态代理
2,动态代理
其中的动态代理,是程序在运行过程中会产生新的类,
而静态代理是在编译是就能知道被代理者的真实类型
静态代理的例子如下:
package com.test.proxy;
//静态代理
public class StateProxy {
}
//定义一个接口类型
interface Shop{
void saleWater();//卖水
void saleFood();//买小吃,食物
}
//
class RealCustormer implements Shop
{
@Override
public void saleWater() {
// TODO Auto-generated method stub
System.out.println("successFul Water");
}
@Override
public void saleFood() {
// TODO Auto-generated method stub
System.out.println("successFul Food");
}
}
//定义快递员(代理)
class ProxyKd implements Shop{
private RealCustormer[] RealCustormer =null;
private int index=0;
public ProxyKd(int index)
{
if(index<0||index>4)
{
index=0;
}
this.index = index;
}
public ProxyKd()
{
for(int i=0;i<5;i++)
{
RealCustormer[i] = new RealCustormer();
}
}
public void saleWater1() {
// TODO Auto-generated method stub
RealCustormer[index].saleWater();
}
@Override
public void saleFood() {
// TODO Auto-generated method stub
//不暴露接口
}
public static void main(String[] args) {
Shop shop = new ProxyKd(3);
shop.saleWater();//只暴露一个买水的方法
}
@Override
public void saleWater() {
saleWater1();
}
}
//动态代理如下
package com.test.proxy;
/**
* 动态代理
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Maintest{
public static void main(String[] args) {
Subject sub = new SubjectImpl();
Proxy1 pr = new Proxy1(sub);
Subject s = (Subject)pr.getProxy();
s.add();
}
}
class Proxy1 implements InvocationHandler{
private Object subject;
public Proxy1(Subject target)
{
this.subject = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("调用之前");
Object object = method.invoke(subject, args);
System.out.println("调用之后");
return object;
}
public Object getProxy(){
ClassLoader loader = Thread.currentThread().getContextClassLoader();//类加载器(当前线程的类加载器)
Class<?>[] interfaces = subject.getClass().getInterfaces();//实现接口的class对象引用
return java.lang.reflect.Proxy.newProxyInstance(Proxy1.class.getClassLoader(),new Class[]{Subject.class} , this);
}
}
interface Subject{
void add();
}
class SubjectImpl implements Subject{
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("add");
}
}
以下来自转载:
.代理模式使用原因和应用方面
(1)授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限.
(2)某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
举例两个具体情况:
如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.
总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系.
(3)现实中,Proxy应用范围很广,现在流行的分布计算方式RMI和Corba等都是Proxy模式的应用
- Java中的代理模式
- JAVA中的代理技术
- Java中的代理模式
- Java中的代理
- Java中的代理模式
- java中的动态代理
- Java 中的代理模式
- java中的动态代理》》》》》
- 浅谈java中的代理
- JAVA 中的 动态代理
- java中的代理
- java中的动态代理
- java中的代理
- Java中的代理
- java中的动态代理
- Java中的动态代理
- Java中的动态代理
- JAVA中的动态代理
- 《Hadoop Operations》读书笔记
- 常用expect 脚本
- Function原型链结构
- Redis主从复制
- Openstack : 15、Openstack-开发基础 entry_points学习
- java 中的代理
- BEC PRELIMINARY LERNING RECORD
- 山东理工热身赛
- Maven学习(六)
- 移动图片
- 《C和指针》6.18.2删除子字符串
- 2017年上海金马五校程序设计竞赛:Problem C : Count the Number
- C#取硬盘、CPU、主板、网卡的序号
- tomcat maxPostSize 404