java代理机制,从使用者的角度,可以实现针对接口进行调用。代理将针对接口的调用,传递给构造代理对象时传入的调用处理器InvocationHandler。
下面举个例子。
1,首先定义一个接口类。
package com.bestree.learn;
/**
* 接口类。
* @author bestree007
*
*/
public interface Hello {
public String sayHello(String str);
}
如何实现调用这个接口,从Java的角度接口类是不能实例化的。
2,现在构造InvocationHandler接口的实现
package com.bestree.learn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理处理类。针对接口的调用,会调用到这个类中的invoke方法。
* @author bestree007
*
*/
public class InvocationHandlerImpl implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke");
return null;
}
}
3,哈,现在试试调用下接口
package com.bestree.learn;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
*
* @author bestree007
*
*/
public class ProxyTest {
public static void main(String[] args) {
InvocationHandler handler = new InvocationHandlerImpl();
Hello hello = (Hello) Proxy.newProxyInstance(Thread.currentThread()
.getContextClassLoader(), new Class<?>[] { Hello.class },
handler);
hello.sayHello("MyGirl");
}
}
运行一下这个main方法,结果打印出
invoke
4,代理的使用,可以在调用具体的被代理的逻辑之前做一些别的操作。以上从针对接口调用的角度来看Java动态代理的功能。使用Java的人强调针对接口编程,这是一个很好的倡议,针对接口编程,接口和接口实现包路径分开,也是osgi场景所提倡的。如果把接口作为服务来看,针对接口调用,调用者只看到接口,实际上调用者仅仅需要关注接口。