使用java动态代理根据访问权限控制对客户信息的修改以保护客户信息,客户的信息包括:姓名name、性别gender、interests兴趣爱好、评分HotOrNot(类似于顶或踩),这些信息可以被所有用户看到,只有顾客可以修改自己的name、gender、interests,但是不能修改自己的评分,只能由其他人给他打分。
即根据权限控制外界修改客户信息的行为以保护客户信息。
1.PersonBean,即代理模式中的抽象角色,java动态代理只能实现对interface的代理
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; public String getName() { return name; } public String getGender() { return gender; } public String getInterests() { return interests; } public int getHotOrNotRating() { if (ratingCount == 0) return 0; return (rating / ratingCount); } public void setName(String name) { this.name = name; } public void setGender(String gender) { this.gender = gender; } public void setInterests(String interests) { this.interests = interests; } public void setHotOrNotRating(int rating) { this.rating += rating; ratingCount++; } }
public class NonOwnerInvocationHandler implements InvocationHandler { PersonBean person; public NonOwnerInvocationHandler(PersonBean person) { this.person = person; } public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException { try { //限制其他人对该客户信息的修改 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")) { throw new IllegalAccessException(); } } catch (InvocationTargetException e) { e.printStackTrace(); } return null; } }
public class OwnerInvocationHandler implements InvocationHandler { PersonBean person; public OwnerInvocationHandler(PersonBean person) { this.person = person; } public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException { try { //控制客户自己对自己的信息的修改,自己不能修改自己的评分 if (method.getName().startsWith("get")) { return method.invoke(person, args); } else if (method.getName().equals("setHotOrNotRating")) { throw new IllegalAccessException(); } else if (method.getName().startsWith("set")) { return method.invoke(person, args); } } catch (InvocationTargetException e) { e.printStackTrace(); } return null; } }
public class Test { public static void main(String[] args) { PersonBean person=new PersonBeanImpl(); InvocationHandler h1=new NonOwnerInvocationHandler(person); InvocationHandler h2=new OwnerInvocationHandler(person); Class[] interfaces= person.getClass().getInterfaces(); ClassLoader loader=h1.getClass().getClassLoader(); PersonBean noOwner=(PersonBean)java.lang.reflect.Proxy.newProxyInstance(loader,interfaces, h1); PersonBean Owner=(PersonBean)java.lang.reflect.Proxy.newProxyInstance(loader,interfaces, h2); //简单测试对set方法的调用权限 noOwner.setHotOrNotRating(4); Owner.setName("heihei"); System.out.println(person.getName()+" "+person.getHotOrNotRating()); System.out.println("-----------------"); noOwner.setName("haha");//抛异常 Owner.setHotOrNotRating(3);//抛异常 } }
在这里,写了两个调用处理器,一个是处理其他人对personBean方法的访问,一个是处理自己对PersonBean方法的访问,主要是控制对set方法的调用以达到保护客户信息的目的,重点是invoke()方法的编写。
转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8973749