动态代理的原理

1、定义一个接口   2、定义一个类来实现该接口    3、使用proxy来动态获取对象的方法,并通过三种不同的方法来增强实体对象的方法(参数增强,返回值增强,方法体增强)
package cn.hopetesting.proxy;

/**
* @author newcityman
* @date 2019/9/13 - 15:22
*/
public interface SaleComputer {
public String sale(double money);
public void show();
}

package cn.hopetesting.proxy;

/**
* @author newcityman
* @date 2019/9/13 - 15:24
*/
public class lenovo implements SaleComputer {

@Override
public String sale(double money) {
System.out.println("花了"+money+"元买了一台联想电脑.....");
return "联想电脑";
}

@Override
public void show() {
System.out.println("炫耀电脑");
}
}


package cn.hopetesting.proxy;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* @author newcityman
* @date 2019/9/13 - 15:34
*/
public class ProxyTest {
public static void main(String[] args) {
//1、创建真实对象
lenovo lenovo = new lenovo();
//2、动态代理增强Lenovo对象
/*
* 三个参数
* 1、类加载器:真实对象.getClass().getClassLoader()
* 2、接口数组:真实对象.getClass().getInterfaces()
* 3、处理器: new InvocationHandler()
* */
SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
/**
*
* @param proxy 代理对象
* @param method 代理对象调用的方法,被封装为对象
* @param args 代理对象条用的方法时,传递的实际参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*System.out.println("动态代理的方法被执行了");
System.out.println(method.getName());
System.out.println(args[0]);*/

if (method.getName().equals("sale")) {
//1、增强参数
double money = (double) args[0];
money = money * 0.85;
System.out.println("专车接");
// 使用真实对象调用方法
String obj =(String) method.invoke(lenovo, money);
System.out.println("免费送货。。。。。");
//增强返回值
obj = obj +"_移动硬盘";
return obj;
} else {
Object obj = method.invoke(lenovo, args);
return obj;
}
}
});

//2、调用方法
String computer = proxy_lenovo.sale(5000);
System.out.println(computer);

/* proxy_lenovo.show();*/


}
}
 
原文地址:https://www.cnblogs.com/newcityboy/p/11517237.html