动态代理:
基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:
loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方法。
例:
*******************************************************************************************************
public interface Human {
void sing(float money);
void dance(float money);
}
*******************************************************************************************************
public class Chun implements Human{
@Override
public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
}
@Override
public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
}
}
*******************************************************************************************************
public class Client {
public static void main(String[] args) {
final Chun c = new Chun();
// 找到春的动态代理类(经纪人)
Human h = (Human)Proxy.newProxyInstance(Chun.class.getClassLoader(),
c.getClass().getInterfaces(), new InvocationHandler(){
@Override // 拦截 proxy: 代理对象的引用 method:当前调用的方法 args:当前方法需要的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 跳舞出场费不能少于30000
if("dance".equals(method.getName())){
float money = (Float)args[0];
if(money>30000){
c.dance(money/2);
}
}
// 唱歌出场费不能少于20000
if("sing".equals(method.getName())){
float money = (Float)args[0];
if(money>20000){
c.sing(money/2);
}
}
return null;
}
});
h.sing(40000);
h.dance(60000);
}
}
*******************************************************************************************************
基于接口的动态代理
java.lang.reflect.Proxy
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
作用:返回代理类的实例
参数:
loader:类加载器,一般与被代理对象使用同一个
interfaces:被代理对象所实现的接口
h:怎么代理
Object invoke(Object proxy, Method method, Object[] args) :调用原有类的任何方法,都会经过此方法。
例:
*******************************************************************************************************
public interface Human {
void sing(float money);
void dance(float money);
}
*******************************************************************************************************
public class Chun implements Human{
@Override
public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
}
@Override
public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
}
}
*******************************************************************************************************
public class Client {
public static void main(String[] args) {
final Chun c = new Chun();
// 找到春的动态代理类(经纪人)
Human h = (Human)Proxy.newProxyInstance(Chun.class.getClassLoader(),
c.getClass().getInterfaces(), new InvocationHandler(){
@Override // 拦截 proxy: 代理对象的引用 method:当前调用的方法 args:当前方法需要的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 跳舞出场费不能少于30000
if("dance".equals(method.getName())){
float money = (Float)args[0];
if(money>30000){
c.dance(money/2);
}
}
// 唱歌出场费不能少于20000
if("sing".equals(method.getName())){
float money = (Float)args[0];
if(money>20000){
c.sing(money/2);
}
}
return null;
}
});
h.sing(40000);
h.dance(60000);
}
}
*******************************************************************************************************