JDK动态代理
JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,
动态将横切逻辑和业务逻辑编制在一起。
Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。缺点:必须要实现一个或多个接口,一个代理类只能服务一个接口,只针对实现了接口的类
1.接口类 mainFunction
package com.tang.DynamicProxyImp;
public interface mainFunction {
public String message();
}
2.业务类 ServiceImp(实现mianFunction接口)
package com.tang.DynamicProxyImp;
public class ServiceImp implements mainFunction{
@Override
public String message() {
// TODO Auto-generated method stub
return "jarrem";
}
}
package com.tang.DynamicProxyImp;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//InvocationHandler是代理实例的调用处理程序 实现的接口
public class DynamicProxy implements InvocationHandler {
private Object object;
public DynamicProxy(Object object){
this.object=object;
}
//实现加强
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object invoke = method.invoke(object, args);
return ((String)invoke).toUpperCase();
}
}
4.测试类 MyTest
package com.tang.DynamicProxyImp;
import java.lang.reflect.Proxy;
public class MyTest {
public static void main(String args[]){
mainFunction mainfunction=new ServiceImp();
DynamicProxy dynamicProxy = new DynamicProxy(mainfunction);
//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
mainFunction proxy=(mainFunction) Proxy.newProxyInstance(
mainfunction.getClass().getClassLoader(), // 定义代理类的类加载器
mainfunction.getClass().getInterfaces(), //代理类要实现的接口列表
dynamicProxy // 指派方法调用的调用处理程序
);
String message = proxy.message();
System.out.println(message);
}
}