JDK since the 1.3 release, the introduction of dynamic agents, the JDK dynamic proxy is very simple to use, but it has a limitation that the use of dynamic proxy objects must implement one or more interfaces . If you want to delegate a class that does not implement an interface, you can use the Cglib package.
Cglib is a powerful, high-performance code-generation package. It is used by many AOP frameworks (such as spring AOP) to provide them with a method of interception (interception). Hibernate also uses Cglib to proxy single-ended single-ended (many-to-one and a-to-a) association. Easymock a package that tests Java code by using a mock (Moke) object. They all create mock-up (Moke) objects for classes that do not have interfaces by using Cglib.
The bottom of the Cglib package is to convert bytecode and generate new classes by using a small, fast bytecode processing framework asm. Direct use of ASM is discouraged because it requires you to be familiar with the format and instruction set of the JVM internal structure including the class file.
The following is a simulation case where the Cglib-nodep-2.1_3.jar package needs to be introduced when using Cglib
Define a HelloWorld class, note that this is a class, not an interface
Package com.ljq.test;
/**
* Define a HelloWorld class
* @author Jiqinlin
*/
public class HelloWorld {
public void SayHelloWorld () {
System.out.println ("helloworld!");
}
}
Cglibproxy class
Package com.ljq.test;
Import Java.lang.reflect.Method;
Import Net.sf.cglib.proxy.Enhancer;
Import Net.sf.cglib.proxy.MethodInterceptor;
Import Net.sf.cglib.proxy.MethodProxy;
/**
* Output two lines of string to the console before and after a method call through the Cglib implementation
*
* @author Jiqinlin
*
*/
public class Cglibproxy implements Methodinterceptor {
The original object to be proxied
Private Object obj;
public object Createproxy (object target) {
This.obj = target;
Enhancer enhancer = new enhancer ();
Enhancer.setsuperclass (This.obj.getClass ());//Set proxy target
Enhancer.setcallback (this);//Set callback
Enhancer.setclassloader (Target.getclass (). getClassLoader ());
return Enhancer.create ();
}
/**
* Process the method call on the proxy instance and return the result
*
* @param proxy
* Proxy class
* @param method
* Method of being represented
* @param params
* parameter array for this method
* @param methodproxy
*/
public object Intercept (object proxy, Method method, object[] params,
Methodproxy methodproxy) throws Throwable {
Object result = null;
Before calling
Dobefore ();
Methods to invoke the original object
result = Methodproxy.invokesuper (proxy, params);
After the call
Doafter ();
return result;
}
private void Dobefore () {
System.out.println ("Before method Invoke");
}
private void Doafter () {
System.out.println ("After method Invoke");
}
}
Test class
Package com.ljq.test;
public class HelloWorldTest {
public static void Main (string[] args) {
HelloWorld helloworld=new HelloWorld ();
Cglibproxy cglibproxy=new cglibproxy ();
HelloWorld hw= (HelloWorld) cglibproxy.createproxy (HelloWorld);
Hw.sayhelloworld ();
}
}
The result of the operation is:
Java Dynamic Agent (ii) CGLIB Dynamic agent Application