package com.powernode.proxy.client;
import com.powernode.proxy.Spring6Config;
import com.powernode.proxy.service.OrderService;
import com.powernode.proxy.service.impl.OrderServiceImpl;
import com.powernode.proxy.util.ProxyUtil;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Client
{
public static void main(String[] args)
{
//创建目标对象
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
//创建代理对象
//类加载器,代理类要实现的接口,调用处理器.var返回对象即代理对象
//newProxyInstance新建代理对象实例
//本质上,这newProxyInstance()方法执行,在内存中动态生成了代理类的字节码,new了一个对象出来
//第一个参数 Classloader loader类加载器(代理类的类加载器必须得和被代理对象的类加载器一样)
//内存当中生成的字节码也是class文件,要执行也必须加载到内存中,加载类就需要类加载器,JDK要求目标类和代理类的加载器必须一样
//第二个参数 Class<?> interface代理类要实现的接口
//代理类和目标类要实现同一个接口或同一些接口,要通知JDK我们实现了什么接口,在内存中生成代理类的时候,需要告知实现了那些接口
//第三个参数 InvocationHandler handler调用处理器,是一个接口
//因为具体要增强什么代码,卸载调用处理器接口中写增强代码
Object o = ProxyUtil.newProxyInstance(orderService);
//调用代理对象的代理方法
//之所以我们可以向下转型,因为我们实现了相同的接口
OrderService OS = (OrderService)o;
//调用代理对象的代理方法,如果是增强的话,目标对象的目标方法需要执行
OS.generate();
OS.Modify();
OS.detail();
String name = OS.getName();
System.out.println(name);
}
}
package com.powernode.proxy.client;
import com.powernode.proxy.Spring6Config;
import com.powernode.proxy.service.OrderService;
import com.powernode.proxy.service.impl.OrderServiceImpl;
import com.powernode.proxy.util.ProxyUtil;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Client
{
public static void main(String[] args)
{
//创建目标对象
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
OrderService orderService = context.getBean("orderServiceImpl", OrderServiceImpl.class);
//创建代理对象
//类加载器,代理类要实现的接口,调用处理器.var返回对象即代理对象
//newProxyInstance新建代理对象实例
//本质上,这newProxyInstance()方法执行,在内存中动态生成了代理类的字节码,new了一个对象出来
//第一个参数 Classloader loader类加载器(代理类的类加载器必须得和被代理对象的类加载器一样)
//内存当中生成的字节码也是class文件,要执行也必须加载到内存中,加载类就需要类加载器,JDK要求目标类和代理类的加载器必须一样
//第二个参数 Class<?> interface代理类要实现的接口
//代理类和目标类要实现同一个接口或同一些接口,要通知JDK我们实现了什么接口,在内存中生成代理类的时候,需要告知实现了那些接口
//第三个参数 InvocationHandler handler调用处理器,是一个接口
//因为具体要增强什么代码,卸载调用处理器接口中写增强代码
Object o = ProxyUtil.newProxyInstance(orderService);
//调用代理对象的代理方法
//之所以我们可以向下转型,因为我们实现了相同的接口
OrderService OS = (OrderService)o;
//调用代理对象的代理方法,如果是增强的话,目标对象的目标方法需要执行
OS.generate();
OS.Modify();
OS.detail();
String name = OS.getName();
System.out.println(name);
}
}
package com.powernode.proxy.util;
import com.powernode.proxy.service.TimerInvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyUtil
{
//封装一个工具方法返回Object
public static Object newProxyInstance(Object obj)
{
Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new TimerInvocationHandler(obj));
return o;
}
}
package com.powernode.proxy.util;
import com.powernode.proxy.service.TimerInvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyUtil
{
//封装一个工具方法返回Object
public static Object newProxyInstance(Object obj)
{
Object o = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new TimerInvocationHandler(obj));
return o;
}
}