之前看了java反射 看得很慢 就是感觉看不走那种 后面通过慢慢观看视频 手写代码 对java反射有了一定的了解
java反射之动态代理
首先理解一下静态代理 什么是静态代理 就是运用接口然后新建一个代理类通过代理类实例化被代理类对象来调用被代理类方法
其次静态代理的缺点 代理类和被代理类在编译期间已经确定不易于程序的扩展 下面一个made nike factory 来帮助理解什么是静态代理
package pers.Hx.dynamic;
//静态代理模式
//接口
interface ClothFactory{
void productCloth();
}
//被代理类
class NikeClothFactory implements ClothFactory{
public void productCloth(){
System.out.println("run i am product Nike!!");
}
}
//代理类
class ProxyFactory implements ClothFactory{
ClothFactory cf; //被代理类的对象
public void productCloth() {
System.out.println("代理类开始执行,收代理费$100000 ");
cf.productCloth();
}
//创建代理类的对象时实际传入一个被代理类的对象
public ProxyFactory(ClothFactory cf){
this.cf = cf;
}
}
//测试动态代理类
public class TestClothFactory {
public static void main(String[] args) {
NikeClothFactory nike = new NikeClothFactory();
ProxyFactory proxy = new ProxyFactory(nike);
proxy.productCloth();
}
}
下面介绍 动态代理
动态代理 优点:可以通过一个类来完成全部的代理功能
代码
package pers.Hx.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理的公共接口 动态代理的使用,体会反射是动态语言的关键
interface Subject{
void action();
}
//被代理类
class RealSubject implements Subject{
public void action(){
System.out.println("i am the Proxy class,please rember excute me! thinks!!!");
}
}
//代理的动态代理类
class MyInvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理的对象的声明
//①给被代理的对象实例化②返回一个代理类的对象
public Object blind(Object obj){
this.obj = obj; //给被代理的对象实例化
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), this);//返回一个代理类的对象
}
//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下 的invoke的方法的调用
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method方法的返回值时retu rnVal
Object returnVal = method.invoke(obj, args);
return returnVal;
}
}
public class TestProxy {
public static void main(String[]args){
//1.倍代理类的对象
RealSubject real = new RealSubject();
//2.创建一个实现了InvacationHandler接口的类的对象
MyInvocationHandler handler =new MyInvocationHandler();
//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
Object obj = handler.blind(real);
System.out.println(obj.toString());
//把代理类对象 强转为本类型
Subject sub = (Subject) obj;
//转到对InvacationHandler接口的实现的invoke()方法的调用
sub.action();
//对静态的例子重新调用
NikeClothFactory nike = new NikeClothFactory();
//直接强制转换
ClothFactory proxyCloth =(ClothFactory) handler.blind(nike);
proxyCloth.productCloth();
}
}
注: 上面两个类的类名分别叫做 TestClothFactory 与 TestProxy
第一个类可以单独运行 因为是独立的并且有main函数
第二个类要运行 必须和第一个类在同一个目录下因为第二个类用了第一个类中的类
建议看了之后手敲一次
毕竟 手敲代码才能真正的理解代码