public class Main {
public static void main(String[] args) {
Water water = new Water();
WaterProxy waterProxy = new WaterProxy(water);
waterProxy.drink();
}
}
//代理类与被代理类共同实现的接口
public interface Drink {
void drink();
}
//被代理的类
public class Water implements Drink {
@Override
public void drink() {
System.out.println("drink water");
}
}
//代理类
//与被代理类实现同一个接口
public class DrinkProxy implements Drink {
private Drink drinkImpl;
//通过构造函数传入Water对象
public DrinkProxy(Drink drinkImpl) {
this.drinkImpl = drinkImpl;
}
@Override
public void drink() {
//在执行被代理对象的方法前做一些事情
System.out.println("before drink");
//执行被代理对象的方法
drinkImpl.drink();
//在执行被代理对象的方法后做一些事
System.out.println("after drink");
}
}
before drink drink water after drink
/** *返回实现了指定接口的对象,调用代理对象的方法会调用 *InvocationHandler的invoke方法 * * @param loader 获取代理类所使用的类加载器 * @param interfaces 代理类所要实现的接口 * @param h 实现了InvocationHandler接口的对象 * @return 代理对象 */ public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
/**
*每个代理类都有一个关联的InvocationHandler
*当代理对象执行一个方法的时候会直接执行invoke方法
*/
public interface InvocationHandler {
/**
* @param 调用该方法的代理对象
* @param method 代理对象所调用的方法
* @param args 调用的方法的参数
* @return 调用的方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args)
}
public class CommonInvocationHandler implements InvocationHandler {
//被代理的对象
private Object proxied;
public CommonInvocationHandler(Object proxied) {
this.proxied = proxied;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在调用被代理对象的方法前做一些事情
System.out.println("before doing something");
//调用被代理对象的方法
Object result = method.invoke(proxied, args);
//在调用被代理对象的方法后做一些事情
System.out.println("after doing something");;
return result;
}
}
public class Main {
public static void main(String[] args) {
//被代理的对象
Water water = new Water();
//动态获取代理对象
Drink waterProxy =
(Drink) Proxy.newProxyInstance(water.getClass().getClassLoader(),
water.getClass().getInterfaces(),
new CommonInvocationHandler(water));
//通过代理对象调用方法
waterProxy.drink();
}
}
before doing something drink water after doing something
//Post请求注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface POST {
String value() default "";
}
//Post请求注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface POST {
String value() default "";
}
public interface Service {
//用POST注解声明请求的方式和相对路径
@POST("/login")
//@Query注解声明请求的参数名
void login(@Query("username")String username,
@Query("password")String password);
}
public class Main {
public static void main(String[] args) {
// 动态获取Service接口的代理
Service service = (Service) Proxy.newProxyInstance(Service.class.getClassLoader(),
new Class[] { Service.class }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 通过注解获取请求的相对路径
String retativePath = ((POST) method.getAnnotations()[0]).value();
System.out.println("relative path: " + retativePath);
// 获取参数的注解
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
// 通过参数的注解获取请求参数
for (int i = 0; i < parameterAnnotations.length; i++) {
if (parameterAnnotations[i].length != 0) {
for (int j = 0; j < parameterAnnotations[i].length; j++) {
Query query = (Query) parameterAnnotations[i][j];
System.out.println(query.value() + ": " + args[i].toString());
}
}
}
return null;
}
});
// 调用代理对象的方法
service.login("hello", "world");
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有