[Java] proxy dinámico

Tema: Usando el sistema de proxy dinámico para lograr una transacción de escritura, en la que el agente cuando el agente de llamada tiene éxito (no lanza ninguna excepción) mencionan cometer, y de vuelta rollo cuando se produce un error. De comprometerse y deshacer tanto para un archivo de texto externo, el archivo no se encuentra dentro del alcance de la excepción del control de Java. Tienes que prestar atención a la operación atómica.

package test;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* 使用Java动态代理实现事务,以向文件中写入内容为例
* */
public class FileWriter1Test {
    static File file = new File("D:\\test12.txt");    //写入内容的目标文件
    static String s = "Hello World! 你好";
    public static void customer(FileWriter1 fileWriter1) {
        try {
            fileWriter1.writer(file,s);         //向file中写入s
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileWriter1 proxy = (FileWriter1) Proxy.newProxyInstance(FileWriter1.class.getClassLoader(),
                new Class[]{ FileWriter1.class },
                new FileWriter1Handler(new FileWriter1Impl()));    //使用Proxy的静态方法newProxyInstance创建代理对象,第一个参数为ClassLoader,第二个参数为代理所需要实现的接口,第三个参数为调用处理器对象
        customer(proxy);   //使用代理
        //customer(new FileWriter1Impl());  //不使用代理
    }
}
/*
* 接口
* */
interface FileWriter1 {
    public abstract void writer(File file, String str) throws IOException;
}
/*
* FileWriter1接口的实现类,同时也是被代理的类
* */
class FileWriter1Impl implements FileWriter1 {
    @Override
    /*
    * 向file文件中写入str
    * */
    public void writer(File file, String str) throws IOException {
        FileWriter fw = new FileWriter(file);
        fw.write(str);
        fw.close();
        //int i = 1/0;   //模拟写入过程中出现错误
    }
}
/*
* 调用处理器
* */
class FileWriter1Handler implements InvocationHandler {
    private Object proxied;    //被代理的对象
    public FileWriter1Handler (Object proxied) {
        this.proxied = proxied;
    }
    @Override
    /*
    * 所有对代理的方法的调用都会在invoke方法中被集中处理
    * proxy是代理对象,method对象就是被调用的方法,args是参数数组
    * 在此方法中我们可以增加被代理的类的方法所不具有的功能,例如本例中增加的就是备份和回滚操作
    * */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        File file = (File)args[0];         //添加数据的目标文件
        File copyFile = new File("D:\\tem" + file.getName());   //目标文件的备份文件
        if (!copyFile.exists()) {
            copyFile.createNewFile();
        }
        copyFile(file, copyFile);         //备份文件
        try {
            Object invoke = method.invoke(proxied, args);  //反射,调用被代类的对应方法
        } catch (Exception e) {
            copyFile(copyFile,file);     //发生异常,回滚事务,将备份文件的内容再次恢复到原文件
        } finally {
            copyFile.delete();      //删除备份文件
        }
        return null;
    }
    /*
    * 将原文件file备份到新的文件copyFile
    * */
    private File copyFile(File file,File copyFile) throws IOException{
        FileReader fr = new FileReader(file);
        FileWriter fw = new FileWriter(copyFile);
        char[] ch = new char[10];
        int n = 0;
        while ((n = fr.read(ch)) != -1) {
            fw.write(ch,0,n);
        }
        fr.close();
        fw.close();
        return copyFile;
    }
}

Me di cuenta de esto cuando se es capaz de cumplir con la agencia para presentar la llamada se realiza correctamente, el retroceso se denomina agente de fracaso. Pero si que me ha pasado mientras que la copia de seguridad de archivos o revertir anormal cómo debemos hacer? Si alguien tiene una solución mejor también, por favor háganoslo saber. Gracias! ! !

Publicado 57 artículos originales · ganado elogios 55 · vistas 1931

Supongo que te gusta

Origin blog.csdn.net/qq_40561126/article/details/104702804
Recomendado
Clasificación