(1)创建一个接口Hello。
package com.example;
public interface Hello {
void sayHello();
}
(2)创建接口的实现类HelloImpl 。
package com.example;
public class HelloImpl implements Hello {
public void sayHello() {
System.out.println("你好!");
}
}
(3)定义动态代理类HelloProxy
,并实现InvocationHandler
接口;重写invoke
方法。
package com.example;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloProxy implements InvocationHandler {
private Hello hello;
public HelloProxy(Hello hello) {
super();
this.hello = hello;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
doSomeThingBefore(); //前置增强
Object ret = method.invoke(hello, args);
doSomeThingEnd(); //后置增强
return ret;
}
private void doSomeThingEnd() {
System.out.println("after");
}
private void doSomeThingBefore() {
System.out.println("before");
}
public Object getProxyInstance() {
//返回的是代理对象
return Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), this);
}
}
getProxyInstance()
方法:建立代理对象和真实对象的关系,返回代理对象。Proxy.newProxyInstance
方法:为真实对象绑定代理对象,并返回代理对象。
关于Proxy.newProxyInstance
方法,里面有三个参数:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
throws IllegalArgumentException
- loader: 用哪个类加载器去加载代理对象。
- interfaces:动态代理类需要实现的接口。
- h:动态代理方法在执行时,会调用h里面的invoke方法去执行。
关于 invoke
方法,里面包含三个参数:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {}
Object proxy
: 代理对象,也就是使用 Proxy.newProxyInstance() 返回的对象。Method method
: 当前调度的方法。由反射获取,当使用代理对象调用接口中的方法时,会自动反射获取相应的真实对象实现的方法。Object[] args
: 调度方法的参数。
(4)测试类。
package com.example;
public class Test {
public static void main(String[] args) {
Hello hello = new HelloImpl();
HelloProxy helloProxy = new HelloProxy(hello);
Hello hello1 = (Hello) helloProxy.getProxyInstance();
hello1.sayHello();
}
}