package jdkdynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties;
/**
* 简单的说一下,代理模式就是再接口和实现类之前加一层,用于剥离接口的一些额外的操作
* @author 123456
*
*/
public class MyProxy {
public interface Hello{
void sayHello();
}
static class MyHello implements Hello{
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello world");
}
}
//自定义invocationHandler代理类
static class MyInvocationHandler implements InvocationHandler{
//目标对象
private Object target;
public MyInvocationHandler(Object target) {
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("===插入前置通知代码====");
//执行相应的目标方法
Object invoke = method.invoke(target, args);
System.out.println("===插入后置通知代码====");
return invoke;
}
}
public static void main(String[] args) {
//生成$Proxy的class文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", true);
Hello hello=(Hello) Proxy.newProxyInstance(Hello.class.getClassLoader(), new Class[] {Hello.class}, new MyInvocationHandler(new MyHello()));//自定义的invocationHandler
hello.sayHello();
}
/**
* 动态代理使用步骤:
* 1.通过实现InvocationHandler接口来定义自己的MyInvocationHandler
*
* 2通过Proxy.getProxyClass获得动态代理类
这里是获取代理类得class type
*
* 3通过反射机制获取代理类的构造方法,方法签名为getConstructor(InvocationHandler.class)
*
* 4通过构造函数获得代理对象并将自定义得InvacationHandler实例对象作为参数传入
*
* 5通过代理对象调用目标方法
*/
}