# OP **Repository Path**: giminey/op ## Basic Information - **Project Name**: OP - **Description**: 简单的代理对象 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-12 - **Last Updated**: 2024-01-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OP #### 介绍 简单的代理对象 #### 软件架构 莫得 #### 安装教程 1. 导包即用 #### 使用说明 ### 1. 实例化一个classConstructor对象,其中方法及功能: - setProxyClassName(String name): 设置代理类的名字如果不设置默认为原类名加proxy - setTargetClass(Class c): 设置需要代理的类 - buildClass(): 生成一个只有名字的代理类 - addFieldOrMethod(String fom): 可以对代理对象添加字段和方法,字段需要添加在方法前面 如果新建方法方法需要通过增强其他方法来调用 - buildMethodFromName(String methodName,String before,String after,Class... parameterTypes): 根据传入的名称和参数类型对对应的方法进行增强 - buildAllMethod(String before,String after): 根据传入字符串对代理对象的所有方法进行增强 - buildObject(): 最后执行,返回生成的代理对象 ### 2. 示例: ##### 1. 新建一个测试类test: ```java public class test { public void sayHello(){ System.out.println("Hello!"); } public String testhello(String a,String b){ return a+b; } } ``` ##### 2. 实例化classConstructor对象,设置需要代理的类型,之后调用上诉方法对代理类进行操作: ```java public class Main { public static void main(String[] args) { classConstructor classconstructor = new classConstructor(); classconstructor.setTargetClass(test.class); classconstructor.buildClass().addFieldOrMethod("String n = \"哈哈\";").addFieldOrMethod("public void haha(){System.out.println(n);}") .buildAllMethod("System.out.println(\"before\");","haha();System.out.println(\"after\");"); test test1= (test) classconstructor.buildObject(); test1.sayHello(); test test2= (test) classconstructor.setProxyClassName("test2").buildClass().buildMethodFromName("testhello","System.out.println(\"before\");","System.out.println(sup);").buildObject(); test2.testhello("ooo","bbb"); } } ``` 1. 通过classConstructor构建了两个test的代理对象,在第一个test对象中增加了一个 `String n = "哈哈"` 属性 同时添加了一个`haha()`方法对其进行打印,通过`buildAllMethod`方法对所有的方法进行统一增强,会在输出 `Hello!`前输出`before`,在输出`Hello!`之后输出`after`,最后调用`buildObject`方法实例化一个对象。 2. 由于对同一个对象代理时候没设置名字默认名字会相同导致冲突,在实例化`test2`的时候调用`setProxyClassName` 方法设置代理的类名防止冲突,然后调用buildClass()重新构造一个类,通过`buildMethodFromName`为指定的`testhello` 方法添加输出语句,由于在方法内预设了两个变量一个是`sup`为调用`super()`方法的返回值所以只能在`after`中调用,一个是`String`类型的 `MethodName`存储这个方法的名称,我们可以调用`sup`对原来的`testhello`方法进行输出。 ##### 3. 运行结果: before Hello! 哈哈 after before ooobbb