静态代理
个人理解,代理,就是在原有的代码上,又新建了一层。
也就是将原本需要实现的代码,在新的一层中,还调用原来的方法,不变的味道,不变的配方。
但是又可以添加新的方法。
就跟中介差不离。
动态代理
动态代理,就是不用实现类,用反射的方式去实现。
利用Proxy类的,newProxyInstance方法来实现动态代理。
package com.bai.demo4;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Human1{
void eat(String food);
}
class superMan2 implements Human1{
public void eat(String food) {
System.out.println("想吃"+food);
}
}
class ProxyFactory2{
public Object getProxy(final Object o){
//第一个参数classLoader,获取类加载器,这里直接用o的加载器,也就是你实现类用什么加载器,代理对象也用什么加载器
//第二个参数是接口,直接获取对象的接口就行,也就是被代理的对象实现什么接口,代理对象就实现什么接口
//第三个是具体的方法实现,是一个InvocationHanler接口,可以用匿名内部类,也可以再写一个类,实现这个接口,把这个实现类放进去。
//类里面写的就是方法的执行。
return Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(o,args);
}
});
}
}
public class ProxyTest2 {
public static void main(String[] args) {
ProxyFactory2 factory2 = new ProxyFactory2();
superMan2 superMan2 = new superMan2();
Human1 proxy = (Human1) factory2.getProxy(superMan2);
proxy.eat("food");
}
}