1.两个整数交换:
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Integer a = 1; Integer b = 2; swap(a, b); System.out.println("a = " + a); // a = 2 System.out.println("b = " + b); // b = 1 } private static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException { Integer c = new Integer(a);//重新分配内存 Integer d = new Integer(b); Field value = Integer.class.getDeclaredField("value"); value.setAccessible(true); value.set(a, d); value.set(b, c); }
2.动态代理:
定义接口:
public interface IBuy { public void buyApple(); public void buybanana(); }
定义实现:
public class Buy implements IBuy{ public void buyApple(){ System.out.println(" buy apple "); } public void buybanana(){ System.out.println(" buy banana "); } }
jdk 动态代理类:
public class JDKDynProxy<T> implements InvocationHandler { private T target; public JDKDynProxy(T target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before ..."); Object o = method.invoke(target, args); System.out.println("after ..."); return o; } public T getInstance(){ return (T)Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } }
cglib动态代理类:
public class CglibProxy<T> implements MethodInterceptor { private T target; private Enhancer enhancer = new Enhancer(); public CglibProxy(T target){ this.target = target; } //通过Class对象获取代理对象 public T getInstance(){ //设置创建子类的类 enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return (T)enhancer.create(); } @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub System.out.println("before ..."); //代理类调用父类的方法 proxy.invokeSuper(obj, args); System.out.println("after ..."); return null; } }
测试类:
public class ProxyTest { public static void main(String[] args) { IBuy buy = new Buy(); JDKDynProxy<IBuy> proxy = new JDKDynProxy(buy); //CglibProxy<IBuy> proxy = new CglibProxy(buy); IBuy proxyBuy = proxy.getInstance(); proxyBuy.buyApple(); proxyBuy.buybanana(); } }