本文共 4062 字,大约阅读时间需要 13 分钟。
public class NonOwnerInvocationHandler implements InvocationHandler{ PersonBean person; public NonOwnerInvocationHandler(PersonBean person){ this.person=person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().startsWith("get")){ return method.invoke(person,args); }else if(method.getName().equals("setHotOrNotRating")){ return method.invoke(person,args); }else if(method.getName().startsWith("set")){ return new IllegalAccessException(); } return null; }}
public class OwnerInvocationHandler implements InvocationHandler{ PersonBean person; public OwnerInvocationHandler(PersonBean person) { this.person=person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().startsWith("get")){ return method.invoke(person,args); }else if(method.getName().equals("setHotOrNotRating")){ return new IllegalAccessException(); }else if(method.getName().startsWith("set")){ return method.invoke(person,args); } return null; }}
public class MatchService { public MatchService() { PersonBean joe = getPersonInfo("joe", "male", "running"); PersonBean OwnerProxy = getOwnerProxy(joe); System.out.println("Name is " + OwnerProxy.getName()); System.out.println("Interests is " + OwnerProxy.getInterests()); OwnerProxy.setInterests("Bowling"); System.out.println("Interests are " + OwnerProxy.getInterests()); OwnerProxy.setHotOrNotRating(50); System.out.println("Rating is " + OwnerProxy.getHotOrNotRating()); OwnerProxy.setHotOrNotRating(40); System.out.println("Rating is " + OwnerProxy.getHotOrNotRating()); System.out.println("**************"); PersonBean nonOwnerProxy = getNonOwnerProxy(joe); System.out.println("Name is " + nonOwnerProxy.getName()); System.out.println("Interests are " + nonOwnerProxy.getInterests()); nonOwnerProxy.setInterests("haha"); System.out.println("Interests are " + nonOwnerProxy.getInterests()); nonOwnerProxy.setHotOrNotRating(60); System.out.println("Rating is " + nonOwnerProxy.getHotOrNotRating()); } PersonBean getPersonInfo(String name, String gender, String interests) { PersonBean person = new PersonBeanImpl(); person.setName(name); person.setGender(gender); person.setInterests(interests); return person; } PersonBean getOwnerProxy(PersonBean person) { return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(),new OwnerInvocationHandler(person)); } PersonBean getNonOwnerProxy(PersonBean person) { return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new NonOwnerInvocationHandler(person)); }}
public interface PersonBean { String getName(); String getGender(); String getInterests(); int getHotOrNotRating(); void setName(String name); void setGender(String gender); void setInterests(String interests); void setHotOrNotRating(int rating);}
public class PersonBeanImpl implements PersonBean{ String name; String gender; String interests; int rating; int ratingcount=0; @Override public String getName() { return name; } @Override public String getGender() { return gender; } @Override public String getInterests() { return interests; } @Override public int getHotOrNotRating() { if(ratingcount==0) return 0; return (rating/ratingcount); } @Override public void setName(String name) { this.name=name; } @Override public void setGender(String gender) { this.gender=gender; } @Override public void setInterests(String interests) { this.interests=interests; } @Override public void setHotOrNotRating(int rating) { this.rating=rating; ratingcount++; }}
远程代理:远程对象的本地代表,通过它可以让远程对象当本地对象来调用。
远程代理通过网络和真正的远程对象沟通信息。代理模式:为一个对象提供一个替身,以控制对这个对象的访问;
被代理的对象:可以是远程对象、创建开销大的对象或需要安全控制的对象; 代理模式有很多变体,都是为了控制与管理对象访问;虚拟代理为创建开销大的的对象提供代理服务;
真正的对象在创建前和创建中时,由虚拟代理来扮演替身;动态代理:运行时动态的创建代理类对象,并将方法调用转发到指定类
看一个找对象项目,个人信息,兴趣爱好,评分