import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyDemo { public static void main(String[] args) { RealObject real = new RealObject(); InvocationHandler handler = new DynamicProxy(real); // 创建代理对象 MyInterface proxy = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[] { MyInterface.class }, handler); // 调用代理对象的方法 proxy.doSomething(); } } interface MyInterface { void doSomething(); } class RealObject implements MyInterface { public void doSomething() { System.out.println("RealObject doSomething"); } } class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method invocation"); Object result = method.invoke(target, args); System.out.println("After method invocation"); return result; } }在上面的代码中,RealObject实现了MyInterface接口,它是我们要代理的实际对象。DynamicProxy类实现了InvocationHandler接口,并在invoke()方法中添加了额外的逻辑,用于在代理对象方法调用前后执行。在main()方法中,我们使用Proxy.newProxyInstance()方法创建代理对象。我们指定了MyInterface接口作为代理对象类型,并将DynamicProxy对象作为代理对象的InvocationHandler。
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CGLIBProxyDemo { public static void main(String[] args) { RealObject real = new RealObject(); MethodInterceptor handler = new CGLIBProxy(real); // 创建代理对象 RealObject proxy = (RealObject) Enhancer.create( RealObject.class, handler); // 调用代理对象的方法 proxy.doSomething(); } } class CGLIBProxy implements MethodInterceptor { private Object target; public CGLIBProxy(Object target) { this.target = target; } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Before method invocation"); Object result = proxy.invoke(target, args); System.out.println("After method invocation"); return result; } }在上面的示例中,我们使用CGLIB的Enhancer类和MethodInterceptor接口来创建代理对象。RealObject类不再需要实现接口,而是直接作为代理对象的类型。在CGLIBProxy类中,我们实现了MethodInterceptor接口,并在intercept()方法中添加了额外的逻辑。
2.CGLIB代理在生成代理对象时,需要改变原有类的结构,因此它可能会引起一些问题,例如无法代理final类或final方法等问题。