1.动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
class Bingbing implements TestInter {
public void findHouse() {
System.out.println("阿兵来租房");
}
@Override
public void findMeizi() {
// TODO Auto-generated method stub
System.out.println("玩儿");
}
}
interface TestInter {
public void findHouse();
public void findMeizi();
}
class ChenChen implements TestInter {
public void findHouse() {
System.out.println("宸宸也去找房子");
}
@Override
public void findMeizi() {
// TODO Auto-generated method stub
System.out.println("过七夕");
}
}
public class demo5 {
public static void main(String[] args) {
TestInter testInter = new ChenChen();
((TestInter) Proxy.newProxyInstance(testInter.getClass().getClassLoader(), new Class[] {TestInter.class},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("扣一个月的房租作为中介费");
Object object = method.invoke(testInter, args);
System.out.println("哈哈大笑");
return object;
}
}
)).findHouse();
}
}
详细解释
-
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class<?>[] { Foo.class }, handler);
**Foo 为接口的类型,也可以定义为Object类型,这里定义为接口可以直接使用方法。**
-
(Foo)的强制类型转换可以不加,例如实例实现了两个接口,一个为Foo,一个为Too,则在new Class<?>[]
{Foo.class , Too.class}加上,这是因为不知到实例类调用哪一个方法,可以不转型。
-
Foo.class.getClassLoader()为获得类的加载器,加载的是代理对象,所以使用的是对应接口的加载器,但是 由于自定义的类的加载器都是同一个加载器,所以别的也是可以的,但是推荐写对应接口的类加载器。便于观看。
4.new Class<?> {暂时不知道啥意思,但是只有在里面写了的接口才可以使用对应的方法}
5.handler ,这个就是要实现的方法
详细解释
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("扣一个月的房租作为中介费");
Object object = method.invoke(testInter, args);
System.out.println("哈哈大笑");
return object;
}
}
1.这里的invoke是自动调用的method方法,你实现啥它就是啥,例如调用了findhouse方法,他就是findhouse
2.object proxy是一个动态代理类,打印的getclass是一个proxy0,暂时不知道啥用
3.method就是要实现的方法
4.传递的参数,无参的话就没用了
详细解释
Object object = method.invoke(testInter, args);
1.这里的object为返回值,如果没有的话就为null
2.invoke中的testinter是一个实例,此处也可以直接new 一个,args就是上面传递的参数。