public class TextApp {
@Test
public void demo01(){
    // 类 =  new 类
    UserServiceImpl userService = new UserServiceImpl();
}

@Test
public void demo02(){
    // 接口 =  new 类
    UserService userService = new UserServiceImpl();
}

/* 静态代理(装饰者)和动态代理 都具有相同的约束条件
 * * 使用前提:必须有接口
 * 
 */

@Test
public void demo03(){
    //实现类 (目标类)
    UserService userService = new UserServiceImpl();

    //1 参数1:ClassLoader 类加载器,用于将类加载到内存
    // * 格式:当前类名.class.getClassLoader()

    //2 参数2:需要实现的所有接口
    // * 格式1:new Class[] { 接口.class }
    // * 格式2:userService.getClass().getInterfaces()   ,目标类上的所有接口

    //3 参数3:InvocationHandler 执行处理类
    // * 代理类的每一个方法被调用时,都将执行处理类的invoke()方法
    // * invoke参数1:Object proxy ,代理类本身,一般没有
    // * invoke参数2:Method method,当前执行的方法
    // * invoke参数3:Object[] args,当前执行方法的实际参数

    //编写代理类(增强)
    UserService proxyService = (UserService)Proxy.newProxyInstance(
                TextApp.class.getClassLoader(), 
                new Class[]{ UserService.class }, 
                new MyInvocationHandler( userService ));

    //入口:使用从代理类获得内容
    proxyService.addUser();
    proxyService.updateUser();

}

}

class MyInvocationHandler implements InvocationHandler {

private UserService userService;
public MyInvocationHandler(UserService userService) {
    this.userService = userService;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //System.out.println("aaaa" + method.getName());
    //执行目标类的方法
    return method.invoke(userService, args);
}

}