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 ...
 
随机推荐
- yii2  打印sql语句
			
echo $temp_chat_query->createCommand()->getRawSql();
 - arcpy批量打印地图
			
有个处理数据的需求是把一个图层中的要素单独显示在底图上,设置固定的比例尺,并打印出图片. 考虑到后续会有重复的大量的数据要处理,决定使用arcpy处理. 首先新建一个mxd底图文档,把需要打印的地图都 ...
 - Pubwin服务端重装(安装)教程
			
此博文已移至爬不稳独立博客:www.pubwin2009.net传送门:http://www.pubwin2009.net/index.php/post/6.html 一,卸载原来服务端和数据库. 1 ...
 - ASP.NET MVC 4.0 学习2-留言板實現
			
新增專案實現留言板功能,瞭解MVC的運行機制 1,新增專案 2,添加數據庫文件message.mdf Ctrl+W,L 打開資料庫連接,添加存放留言的Atricle表 添加字段,後點擊&quo ...
 - html  css 笔记
			
cursor其他取值 鼠标移入 auto :标准光标 default :标准箭头 pointer :手形光标 wait ...
 - 微软的OneDrive研究~
			
Dropbox 很好,唯一觉得不爽的是只能同步指定的目录.不过被墙之后就不那么方便了,所以改用微软的 Live Mesh,缺点是支持的设备少(仅 PC 和 Mac). https://technet. ...
 - C# 新特性_协变与逆变 (.net 4.0)
			
C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...
 - C# 将字节流转换为图片的实例方法
			
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Dr ...
 - Hibernate更新部分字段浅谈
			
update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题 ...
 - 所闻所获5:关于iOS的证书
			
去年做ondine时,被iOS的证书搞得很是头大,做完了之后感觉一片混乱,印象也不是很深.最近又发布了meditashayne,个人的第二个App,也就重温了一下证书的一些相关操作.这一次的理解比较深 ...