package com.baidu.cglib; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; /** * 通过Cglib实现在方法调用前后向控制台输出两句字符串 * * @author jiqinlin * */ public class CglibProxy implements MethodInterceptor { public Object createProxy(Class<?> targetClass) { // this.obj = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(targetClass);// 设置代理目标 enhancer.setCallback(this);// 设置回调 enhancer.setClassLoader(targetClass.getClassLoader()); return enhancer.create(); } /** * 在代理实例上处理方法调用并返回结果 * * @param proxy * 代理类 * @param method * 被代理的方法 * @param params * 该方法的参数数组 * @param methodProxy */ public Object intercept(Object proxy, Method method, Object[] params, MethodProxy methodProxy) throws Throwable { Object result = null; // 调用之前 doBefore(); // 调用原始对象的方法 result = methodProxy.invokeSuper(proxy, params); // 调用之后 doAfter(); return result; } private void doBefore() { System.out.println("before method invoke"); } private void doAfter() { System.out.println("after method invoke"); } public static void main(String[] args) { CglibProxy cglibProxy=new CglibProxy(); HelloWorld hw=(HelloWorld)cglibProxy.createProxy(HelloWorld.class); hw.sayHelloWorld(); } }
package com.baidu.cglib; public class HelloWorld { public void sayHelloWorld() { System.out.println("HelloWorld!"); } }
不同对象的拷贝
package com.baidu2; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Modifier; import org.apache.commons.beanutils.PropertyUtils; /** * 对象与对象深度拷贝,包括嵌套的复合类型,可以忽略类型,只要有相通的属性名 * 数组也可以处理,即便dest是一个空数组 */ public class MyBeanUtils { // 不同对象简单域拷贝 public static void copy2(Object object1, Object object2) throws Exception { Field[] fields = object1.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); Field field2 = object2.getClass().getDeclaredField(name); field2.setAccessible(true); Field field1 = fields[i]; field1.setAccessible(true); // System.out.println(field1.getModifiers()); /*if ((field1.getModifiers() & java.lang.reflect.Modifier.STATIC) != java.lang.reflect.Modifier.STATIC) { field2.set(object2, field1.get(object1)); }*/ if(!Modifier.isStatic(field1.getModifiers())) { field2.set(object2, field1.get(object1)); } } } /** * * @param dest 目标对象 * @param orig 原始对象 * @throws Exception */ public static void copy(Object dest, Object orig) throws Exception { if (dest == null) { throw new IllegalArgumentException("No destination bean specified"); } if (orig == null) { throw new IllegalArgumentException("No origin bean specified"); } Class origClass = orig.getClass(); Class destClass = dest.getClass(); if (origClass == String.class || origClass.isPrimitive()) { dest = orig; } if(orig.getClass().isArray()){ Object[] destArr = (Object[]) dest; Object[] origArr = (Object[]) orig; Class elemenClass = destArr.getClass().getComponentType(); for(int i=0;i<origArr.length;i++){ if(destArr[i]==null){ destArr[i] = elemenClass.newInstance(); } copy(destArr[i], origArr[i]); } } String classLogInfo = "origClass:"+origClass.getName()+",destClass:"+destClass.getName()+","; PropertyDescriptor[] origDescriptors = PropertyUtils .getPropertyDescriptors(orig); for (int i = 0; i < origDescriptors.length; i++) { String name = origDescriptors[i].getName(); if ("class".equals(name)) { continue; } Object value = null; if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(dest, name)) { try { value = PropertyUtils.getSimpleProperty(orig, name); PropertyUtils.setSimpleProperty(dest, name, value); } catch (IllegalArgumentException e) { // 类型不同 try { PropertyDescriptor targetDescriptor = PropertyUtils .getPropertyDescriptor(dest, name); Object new_value = targetDescriptor.getPropertyType() .newInstance(); copy(new_value, value); // LOG.info(new_value); PropertyUtils.setSimpleProperty(dest, name, new_value); }catch(IllegalArgumentException e1){ // } catch (IllegalAccessException e1) { throw e1; } catch (InvocationTargetException e1) { throw e1; } catch (NoSuchMethodException e1) { throw e1; } catch (InstantiationException e1) { throw e1; } } catch (NoSuchMethodException e) { throw e; } catch (IllegalAccessException e) { throw e; } catch (InvocationTargetException e) { throw e; } } } } }