按代理创建的时间,可以分为静态代理和动态的代理
静态代理:在程序运行之前,代理类就以.class文件格式存在
动态代理:在程序运行时,由反射机制动态创建而成。
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
静态代理例子:
//抽象主题
interface Subject{
void operator();
}
//具体主题
class RealSubject implements Subject{
@Override
public void operator(){
System.out.println("RealSubject Operator()");
}
}
//代理类
class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject){
this.subject = subject;
}
@Override
void operator(){
System.out.println("Proxy Before");
subject.operator();
System.out.println("Proxy after");
}
}
//客户端
class client{
public static void main(String[] args){
Subject subject = new RealSubject();
ProxySubject proxy = new ProxySubject(subject);
proxy.operator();
}
}
静态代理的弊端就是代理类要实现一个具体的类,由此引申出动态代理,让我们的具体的代理类在运行时候通过JAVA反射机制去创建。
动态代理核心是这两个类:Proxy.java 和InvocationHander.java
Proxy的newProxyInstance帮我们执行了生成代理类——获取构造器——生成代理对象这三步;
//调度处理器接口
interface InvocationHandler{
/**
* invode方法封装了我们要代理的对象实例的数据。
* @param proxy 代理的对象的实例
* @param method 代理实现的方法
* @param args 代理方法需要的参数
*/
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
}
//代理类,相当于静态代理中ProxySubject功能
class Proxy{
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h){
//...
}
}
动态代理例子:
//抽象主题
interface Subject{
void operator();
}
//具体主题
class RealSubject implements Subject{
@Override
public void operator(){
System.out.println("RealSubject Operator()");
}
}
//代理类
class ProxyHandler implements InvocationHandler{
private Object tar;
public Object bind(Object tar){
this.tar = tar;
return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
tar.getClass().getInterfaces(),
this)
}
@Override
public Object invoke(Object proxy,Method method,Object[] args){
Object result = null;
//这里就可以进行所谓的AOP编程了
//在调用具体函数方法前,执行功能处理
System.out.println("Proxy Before");
result = method.invoke(tar,args)
System.out.println("Proxy after");
return result;
}
}
//客户端
class client{
public static void main(String[] args){
//Subject subject = new RealSubject();
ProxyHandler proxy = new ProxyHandler();
//这一步动态生成代理类
Subject subject = proxy.bind(new RealSubject())
subject.operator();
}
}