1.什么是Java动态代理
代理:一种设计模式,其目的是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类提供消息处理,过滤消息并转发消息,以及进行消息被委托后的后续处理。
2.Java动态代理能用来做什么,在什么场景能用到
3.怎么使用Java动态代理
4.Java动态代理的优缺点
5.Java动态代理是如何实现的(实现机制)
接口:
package org.operamasks.javabase;
/**
* @author chenhaiyu e-mail:chenhaiyu@apusic.com
* 2011-6-24 上午10:12:30
*/
public interface HelloWorld {
public void sayHello();
}
package org.operamasks.javabase;
/**
* @author chenhaiyu e-mail:chenhaiyu@apusic.com
* 2011-6-24 上午10:12:51
*/
public class HelloWorldImpl implements HelloWorld {
public void sayHello() {
System.out.println("say hello!");
}
}
package org.operamasks.javabase.handler;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author chenhaiyu e-mail:chenhaiyu@apusic.com
* 2011-6-24 上午10:14:04
*/
public class HelloWorldHandler implements InvocationHandler {
private Object proxyObj;
public HelloWorldHandler(Object obj) {
this.proxyObj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doBefore();
Object result = method.invoke(this.proxyObj, args);
doAfter();
return result;
}
private void doBefore() {
System.out.println("do before");
}
private void doAfter() {
System.out.println("do after");
}
}
package org.operamasks.javabase;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import org.operamasks.javabase.handler.HelloWorldHandler;
/**
* @author chenhaiyu e-mail:chenhaiyu@apusic.com 2011-6-24 上午10:16:44
*/
public class Main {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldImpl();
InvocationHandler handler = new HelloWorldHandler(hw);
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(hw.getClass().getClassLoader(), hw.getClass().getInterfaces(), handler);
proxy.sayHello();
}
}
//cglib动态代理
package org.operamasks;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class TestCglib {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(HelloWorld.class);
enhancer.setCallback(new MethodInterceptorImpl());
HelloWorld hello = (HelloWorld)enhancer.create();
hello.sayHello();
}
}
class MethodInterceptorImpl implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Proxy");
proxy.invokeSuper(obj, args);
System.out.println("My AOP");
return null;
}
}