前言:
java的动态代理是指进行明确的分工的操作(多接口 比如我是酒店的老板 有人找我合作 需要先经过前台 我的助理 而不是直接找我)
序列化 :为什么序列化 序列化的对象是一个类 我们也叫对象 class一堆东西里面有很多函数方法 假如我现在是app我想调用web上写好的一个对象 我不能直接把那个对象传输过来吧
因为这个对象在web上假如web使用的是php那他不认识啊 这个时候就需要序列化一下 把他序列化成方便传输的形式 从而实现互通 对方反序列之后就能直接使用
记住java反序列的流程 : 序列化的 对象是 一个对象 结果是输出一个装着对象的文件
反:对象是一个文件 目标是一个对象
动态代理的实现
public interface User { //创建一个接口void sayxiaodi(String name,int money);}
上边这个是接口 下面这个是创建的使用
public class UserImpt implements User{ //创建类调用User接口@Overridepublic void sayxiaodi(String name,int money) { //使用接口的sayxiaodi方法System.out.println("hi "+name+",i want sign up"); //name是最后实现的时候 用户设置的System.out.println("i have paid "+money); //这个是用户的缴费}
}
反射方法获取 实例化接口的类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//因为是反射 调用其他的类所以要使用 invoke接口
public class UserImptInhander implements InvocationHandler {private Object target;public UserImptInhander(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("hello,i am "+args[0]); //这个是接口被触发的时候就会显示Object invoke = method.invoke(target, args); //使用 UserImpt 的类内的方法System.out.println("okay,you are my baby");return invoke;}
}
调用接口
import java.lang.reflect.Proxy;public class UserProxy {public static void main(String[] args) {// 创建目标对象User user = new UserImpt();// 创建 userImptInhanderUserImptInhander userImptInhander = new UserImptInhander(user);// 创建代理对象User proxy=(User)Proxy.newProxyInstance(UserImpt.class.getClassLoader(),new Class<?>[]{User.class},userImptInhander);proxy.sayxiaodi("xiaodi",3000); //用户的设置proxy.sayxiaodi("moonsec",5000);}}
我们运行代理
这个就是自动回复的使用
看一下调用的顺序
打个断点然后点击上面的蜘蛛
然后点f7进行步入
invoke()这个函数就是出现在反射机制中 用户调用其他类的方法
arg[0] 就是表示参数
为什么学这个动态的代理:主要是了解链:许多链就是调用使用接口的一些类 然后如果其他的类中有
Runtime.getRuntime().exec("calc");
那就能触发命令执行
因为看到了他的跳转机制所以我们直接 添加一句
我们运行的是
代理对象怎么触发计算机了
这个有个触发链
UserproxyUserimptlnheadUserimptln内的Runtime.getruntime("CALC")
上面这个就是动态代理的触发链
主要的学习目标就是 :了解invoke()导致的链的触发