AspectJ截获操作
package com.example.aspectjandroidtest; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import org.apache.http.util.EncodingUtils; import com.facebook.crypto.Crypto; import com.facebook.crypto.Entity; import com.facebook.crypto.keychain.SharedPrefsBackedKeyChain; import com.facebook.crypto.util.SystemNativeCryptoLibrary; public aspect FileAspectJ { private boolean isEncryption = true; //使用秘钥链和原生库的默认实现,来创建一个新的加密对象 Crypto crypto = new Crypto( new SharedPrefsBackedKeyChain(MainActivity.context), new SystemNativeCryptoLibrary()); //创建应用文件的切点集合 pointcut openFileOutput(String filename,int mode) : !within(FileAspectJ) && args(filename,mode) && call(* openFileOutput(..)); after (String filename,int mode) returning : openFileOutput(filename, mode){ //System.out.println("fx Aspectj openFile is start"); byte[] buffer; try { System.out.println("fx Aspectj openFileName"+filename); buffer = filename.getBytes("UTF8"); FileOutputStream fileOutputStream = null; try { //记录本应用加密过的文件 fileOutputStream = MainActivity.context.openFileOutput("fileList", MainActivity.context.MODE_APPEND); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fileOutputStream.write(buffer); fileOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //读取应用文件的切点集合 pointcut openFileInput(String filename) : !within(FileAspectJ) && args(filename) && call(* openFileInput(..)); before(String filename) : openFileInput(filename){ String result = ""; try { FileInputStream fileInputStream = MainActivity.context.openFileInput("fileList"); int bufferSize = 0; try { bufferSize = fileInputStream.available(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 取得输入流的字节长度 byte buffer[] = new byte[bufferSize]; try { fileInputStream.read(buffer); fileInputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } result = EncodingUtils.getString(buffer, "UTF-8"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //判断文件是否加密过 if(result.indexOf(filename) == -1){ isEncryption = false;//未加密 System.out.println("fx 文件未加密"); }else{ isEncryption = true;//已加密 System.out.println("fx 文件已加密"); } } //截获到File的new操作 pointcut filePointcut(String pathname ) : !within(FileAspectJ) && args(pathname) && call(java.io.File.new(..)); before(String pathname ) : filePointcut(pathname) { System.out.println("fx pathname is " + pathname); } //写文件切点的集合 pointcut writePointcut(FileOutputStream fileStream, byte[] buffer) : !within(FileAspectJ) && target(fileStream)&& args(buffer) && call(* write(..)); void around(FileOutputStream fileStream, byte[] buffer) : writePointcut(fileStream, buffer) { System.out.println("fx Aspectj write is start"); //检查加密功能是否可用 //如果Android没有正确载入库,则此步骤可能失败 if (!crypto.isAvailable()) { System.out.println("return error"); return; } OutputStream fbFileStream = new BufferedOutputStream(fileStream); try { //创建输出流,当数据写入流的时候进行加密,并将加密后的数据输出到文件 OutputStream outputStream = crypto.getCipherOutputStream( fbFileStream, new Entity("test")); outputStream.write(buffer); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } //读文件切点集合 pointcut readPointcut(FileInputStream fileStream, byte[] buffer) : !within(FileAspectJ) && target(fileStream)&& args(buffer) && call(* read(..)); int around(FileInputStream fileStream, byte[] buffer) : readPointcut(fileStream, buffer) { System.out.println("fx Aspectj read is start"); int bufferSize = 0; if(isEncryption==false){ return 0; } try { //文件流解密操作 InputStream inputStream = crypto.getCipherInputStream(fileStream, new Entity("test")); bufferSize = inputStream.available(); // 取得输入流的字节长度 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len; if (inputStream != null) { try { while ((len = inputStream.read(data)) != -1) { outputStream.write(data, 0, len); } data = outputStream.toByteArray(); } catch (IOException e) { } } for(int i = 0;i<data.length;i++) { buffer[i] = data[i]; } inputStream.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } return bufferSize; } }
AspectJ截获操作的更多相关文章
- Spring的入门学习笔记 (AOP概念及操作+AspectJ)
AOP概念 1.aop:面向切面(方面)编程,扩展功能不通过源代码实现 2.采用横向抽取机制,取代了传统的纵向继承重复代码 AOP原理 假设现有 public class User{ //添加用户方法 ...
- WCF 已知类型和泛型解析程序 KnownType
数据协定继承 已知类型和泛型解析程序 Juval Lowy 下载代码示例 自首次发布以来,Windows Communication Foundation (WCF) 开发人员便必须处理数据协定继承方 ...
- KVM 实现机制
1.1. KVM简介 KVM是一个基于Linux内核的虚拟机,它属于完全虚拟化范畴,从Linux-2.6.20开始被包含在Linux内核中.KVM基于x86硬件虚拟化技术,它的运行要求Intel ...
- DPDK support for vhost-user
转载:http://blog.csdn.net/quqi99/article/details/47321023 X86体系早期没有在硬件设计上对虚拟化提供支持,因此虚拟化完全通过软件实现.一个典型的做 ...
- [Spring-AOP-XML] 利用Spirng中的AOP和XML进行事务管理
Spring中的AOP进行事务管理有三种方式 A.自定义事务切面 利用AspectJ来编写事务,我们一般把这个切面作用在service层中.其他代码在下面 编写一个Transaction实现类,通过S ...
- Windows API 查找窗体,发送Windows消息
最近项目中需要做Windows消息截获操作,在网上找了一些资料. public class WindowsAPI { /// <summary> /// 回调函数代理 /// </s ...
- KVM分析报告
转载 KVM分析报告 虚拟化技术工作组 2008-12-31 1. 概述 1.1. KVM简介 KVM是以色列开源组织Qumranet开发的一个开源虚拟机监控器,从Linux-2. ...
- 《Spring源码深度解析》一
Spring整体架构 1.1 Spring整体架构 1.1.1 Core Container: 模块:Core.Beans.Context和Expression Language Core:框架的基础 ...
- Spring_day03--课程安排_基于aspectj的注解aop_Spring的jdbcTemplate操作
Spring_day03 上节内容回顾 今天内容介绍 基于aspectj的注解aop Spring的jdbcTemplate操作 增加 修改 删除 查询 Spring配置c3p0连接池和dao使用jd ...
随机推荐
- linux下python多版本共存
为何要安装python,linux下不是已经集成了python吗? 大多数linux系统都集成了python,但是他们的版本太低了.不能满足我们的需求,尤其是好多系统居然仍停留在 python2.6. ...
- Android Studio Linking an external C++ project 时候 报Invalid file name. Expected: CMakeLists.txt
Android Studio 右键Linking an external C++ project 时候 报Invalid file name. Expected: CMakeLists.txt错误 查 ...
- information_schema.events 学习
information_schema.events 表保存了整个mysql实例中的event 信息 1.常用列: 1.event_catalog :永远是def 2.event_schema :eve ...
- Azure上A/D系列虚拟机到DS系列迁移(1)
有一些用户在刚开始的时候创建了A7,D14等虚拟机来跑一些IO要求比较高的应用,比如Oracle数据库,MySQL数据库,等到用户量上来之后,性能不够,需要升级数据磁盘到SSD固态硬盘,但是问题是: ...
- inotifywait实现目录监控
http://blog.csdn.net/firefoxbug/article/details/8188804
- Why Does Qt Use Moc for Signals and Slots(QT官方的解释:GUI可以是动态的)
GUIs are Dynamic C++ is a standarized, powerful and elaborate general-purpose language. It's the onl ...
- VS_QT中配置qDebug输出
在使用qt_create时可以使用qDebug进行调试输出.在VS中也可以使用.但需要配置.配置过程如下图所示: 一.首先右击工程名,选择最后一个选项“Properties” 二.然后选择Linker ...
- 八大排序c++可运行精简版,一目了然
#include <iostream> using namespace std; // 插入排序开始===================== void insert_sort(int a ...
- Linux 搭建SVN 服务器
一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository) 中 ...
- wget命令1(转载)
Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP协 ...