Proxy的使用, System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");这个参数可在target目录下生成反射生成的代理的class文件,可反编译进行查看
package com.mhc.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author Tiger Meng
* @version $Id: MyProxy, v 0.1 2019/1/14 11:13 Tiger Meng Exp $$
*/
public class MyProxy {
public interface IHello{
void sayHello();
}
static class Hello implements IHello{
@Override
public void sayHello() {
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 rs = method.invoke(target,args);
System.out.println("======插入后置处理代码====");
return rs;
}
}
public static void main1(String[] args) throws Exception {
//生成$Proxy0的class文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
//获取动态代理类
Class proxyClazz = Proxy.getProxyClass(IHello.class.getClassLoader(), IHello.class);
//获取代理类的构造函数,并传入参数类型InvocationHandler.class
Constructor constructor = proxyClazz.getConstructor(InvocationHandler.class);
//通過構造函數來創建動態代理對象,將自定義的InvocationHandler實例傳入
IHello iHello = (IHello) constructor.newInstance(new MyInvocationHandler(new Hello()));
//通過代理對象調用目標方法
iHello.sayHello();
}
public static void main(String[] args) throws Exception{
//生產$Proxy0的class文件
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[]{IHello.class}, new MyInvocationHandler(new Hello()));
iHello.sayHello();
}
}