package com.feng.design.invocation; public interface PersonBean { String getName(); String getGender(); String getInterests(); int getHotOrNotRating(); void setName(String name); void setGender(String gender); void setInterests(String interest); void setHotOrNotRaion(int rating); } package com.feng.design.invocation; public class PersonBeanImpl implements PersonBean { String name; String gender; String interests; int rating; int ratingCount = 0; public PersonBeanImpl(String name, String gender, int rating, int ratingCount) { this.name = name; this.gender = gender; this.rating = rating; this.ratingCount = ratingCount; } @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 interest) { this.interests = interest; } @Override public void setHotOrNotRaion(int rating) { this.rating += rating; ratingCount ++; } } package com.feng.design.invocation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Owner implements InvocationHandler { PersonBean person; public Owner(PersonBean person) { this.person = person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if(method.getName().startsWith("get")) { return method.invoke(person, args); }else if(method.getName().equals("setHotOrNotRaion")) { throw new IllegalAccessException("don't access"); }else if(method.getName().startsWith("set")) { return method.invoke(person, args); } }catch(Exception e) { e.printStackTrace(); } return null; } } package com.feng.design.invocation; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Noner implements InvocationHandler { PersonBean person; public Noner(PersonBean person) { this.person = person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if(method.getName().startsWith("get")) { return method.invoke(person, args); }else if(method.getName().equals("setHotOrNotRaion")) { return method.invoke(person, args); }else if(method.getName().startsWith("set")) { throw new IllegalAccessException("don't access"); } }catch(Exception e) { e.printStackTrace(); } return null; } } package com.feng.design.invocation; import java.lang.reflect.Proxy; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub PersonBean person = new PersonBeanImpl("james", "basketball", 12, 2); PersonBean owner = getOwnerProxy(person); System.out.println(owner.getName()); owner.setName("wade"); System.out.println(owner.getName()); owner.setHotOrNotRaion(4); System.out.println("-------------------------------------"); PersonBean noner = getNoneProxy(person); System.out.println(noner.getHotOrNotRating()); noner.setHotOrNotRaion(4); System.out.println(noner.getHotOrNotRating()); System.out.println(noner.getName()); noner.setName("bosh"); System.out.println(noner.getName()); } public static PersonBean getOwnerProxy(PersonBean person) { return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), new Owner(person)); } public static PersonBean getNoneProxy(PersonBean person) { return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), new Noner(person)); } } |
|
来自: Bradypod > 《design pattern》