首先创建接口
//租房接口
public interface Rent {
//租房方法
void rent();
}
实现接口方法
//房东
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东要出租房子");
}
}
重点来了,创建一个生成动态代理的类
public class ProxyInvocationHandler implements InvocationHandler {
private Rent rent;//自定义需要代理的 接口,也可以是Object类,new的时候可以再 强转
//生成set方法用来注入 动态对象
public void setRent(Rent rent) {
this.rent = rent;
}
public Object getProxy()
{
/*生成得到代理类 --自定义方法
通过Proxy.newProxyInstance()方法
参数1---是ClassLoader-----通过this.getClass().getClassLoader()获得--this其实就是这个实现类本身)
参数2---是newClass就是你要代理的 接口 是谁??通过.getClass().getInterfaces()得到接口
参数3---是InvocationHandler接口本身--用this就可以
*/
Object o = Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
return o;
}
//重写实现 (必须) InvocationHandler接口方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
//通过method反射对象的invoke方法 ,执行需要的方法
//第一个参数,接口或者实例对象,第二个是参数-----有没有感觉很熟悉,其实就是通过反射的机制
Object invoke = method.invoke(rent, args);
return invoke;
}
}
测试
public static void main(String[] args)
{
//真实对象
Host host = new Host();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
//调用 set方法传入 真实对象
pih.setRent(host);
//通过 get方法 获得对象
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
学过反射 只要用过 invoke()方法,就能看懂原理,其实很简单