动态代理的原理

Posted newcityboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理的原理相关的知识,希望对你有一定的参考价值。

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();*/




 

以上是关于动态代理的原理的主要内容,如果未能解决你的问题,请参考以下文章

java动态代理:JDK动态代理的内部原理

jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

JDK 动态代理(原理 + 代码实现)

设计模式 结构型模式 -- 代理模式(动态代理(JDK动态代理(JDK动态代理要求必须定义接口,对接口进行代理。)动态代理原理(使用arthas-boot.jar查看代理类的结构)动态代理的作用)(代

细说JDK动态代理的实现原理