java中的代理有静态代理和动态代理。
java中规定,动态代理的对象必须要有实现一个接口,因为是为动态创建了一个这个接口的实现类,
在JDK1.5之后提供了一个"java.lang.reflect.Proxy"类,通过"Proxy"类的newProxyInstance静态方法创建一个接口的代理对象,这个代理对象可以调用接口的方法。
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
newProxyInstance方法返回一个代理对象,这个方法总共有3个参数:
ClassLoader指明生成代理对象使用哪个接口类装载器,
Class<?>[]指明生成哪个接口的代理对象,
InvocationHandler用来指明产生的这个代理对象要做什么事情。
package com.test;
/**
* Created by admin on 2018/2/4.
*/
public interface StarMan {
String sing(String name);
}
package com.test;
/**
* Created by admin on 2018/2/4.
*/
public class LiuDeHua implements StarMan {
public String sing(String name){
System.out.println("刘德华唱"+name+"歌!!");
return "歌唱完了,谢谢大家!";
}
}
package com.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by admin on 2018/2/4.
*/
public class ProxyOrg {
public static StarMan getStarManProxy(String starName) {
Class<?>[] interfaces={StarMan.class};
return (StarMan) Proxy.newProxyInstance(StarMan.class.getClassLoader(), interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=null;
if (method.getName().equals("sing")) {
System.out.println("我是经纪人,找明星唱歌得先给十万块钱!!");
if(starName.equals("刘德华")){
StarMan starMan = new LiuDeHua();
result = method.invoke(starMan, args); //代理对象调用真实目标对象的sing方法去处理用户请求
}else{
System.out.println("联系不到"+starName);
}
}
return result;
}
});
}
}
package com.test;
/**
* Created by admin on 2018/2/4.
*/
public class Main {
public static void main(String[] args) {
StarMan p = ProxyOrg.getStarManProxy("刘德华");
String retValue = p.sing("冰雨");
System.out.println(retValue);
p = ProxyOrg.getStarManProxy("黄家驹");
retValue = p.sing("海阔天空");
System.out.println(retValue);
}
}