android 反射机制
public class FileUtils
{
public static final int S_IRWXU = 00700;
public static final int S_IRUSR = 00400;
public static final int S_IWUSR = 00200;
public static final int S_IXUSR = 00100;
public static final int S_IRWXG = 00070;
public static final int S_IRGRP = 00040;
public static final int S_IWGRP = 00020;
public static final int S_IXGRP = 00010;
public static final int S_IRWXO = 00007;
public static final int S_IROTH = 00004;
public static final int S_IWOTH = 00002;
public static final int S_IXOTH = 00001;
public static final class FileStatus {
public int dev;
public int ino;
public int mode;
public int nlink;
public int uid;
public int gid;
public int rdev;
public long size;
public int blksize;
public long blocks;
public long atime;
public long mtime;
public long ctime;
}
public static native boolean getFileStatus (String path, FileStatus status);
private static final Pattern SAFE_FILENAME_PATTERN = Pattern.compile("[\w%+,./=_-]+");
public static boolean copyFile(File srcFile, File destFile) {
boolean result = false;
try {
InputStream in = new FileInputStream(srcFile);
try {
result = copyToFile(in, destFile);
} finally {
in.close();
}
} catch (IOException e) {
result = false;
}
return result;
}
public static boolean copyToFile (InputStream inputStream, File destFile) {
try {
if (destFile.exists()) {
destFile.delete();
}
OutputStream out = new FileOutputStream(destFile);
try {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) >= 0) {
out.write(buffer, 0, bytesRead);
}
} finally {
out.close();
}
return true;
} catch (IOException e) {
return false;
}
}
public static boolean isFilenameSafe(File file) {
return SAFE_FILENAME_PATTERN.matcher(file.getPath()).matches();
}
public static String readTextFile(File file, int max, String ellipsis) throws IOException {
InputStream input = new FileInputStream(file);
try {
long size = file.length();
if (max > 0 || (size > 0 && max == 0)) {
if (size > 0 && (max == 0 || size < max)) max = (int) size;
byte[] data = new byte[max + 1];
int length = input.read(data);
if (length <= 0) return "";
if (length <= max) return new String(data, 0, length);
if (ellipsis == null) return new String(data, 0, max);
return new String(data, 0, max) + ellipsis;
} else if (max < 0) { // "tail" mode: keep the last N
int len;
boolean rolled = false;
byte[] last = null, data = null;
do {
if (last != null) rolled = true;
byte[] tmp = last; last = data; data = tmp;
if (data == null) data = new byte[-max];
len = input.read(data);
} while (len == data.length);
if (last == null && len <= 0) return "";
if (last == null) return new String(data, 0, len);
if (len > 0) {
rolled = true;
System.arraycopy(last, len, last, 0, last.length - len);
System.arraycopy(data, 0, last, last.length - len, len);
}
if (ellipsis == null || !rolled) return new String(last);
return ellipsis + new String(last);
} else {
ByteArrayOutputStream contents = new ByteArrayOutputStream();
int len;
byte[] data = new byte[1024];
do {
len = input.read(data);
if (len > 0) contents.write(data, 0, len);
} while (len == data.length);
return contents.toString();
}
} finally {
input.close();
}
}
}
网上的搜索到的信息
android系统中,有很多类和方法是@hide属性的,这意味着这些类和方法是不会出现在androidsdk中的。但是有的时候我们的程序却需要调用这些个类和方法来完成一些工作。怎么办呢?一个办法是把这些个类和方法从android源代码中拷贝出来,放到我们的程序中一起编译使用。不过有可能会遇到一个比较极端的情况,那就是你花费了很久,终于把自己的程序编译成功了,却发现你几乎把整个android
framework的源代码都拷贝出来了。有些时候这样显然是得不偿失的。你花费了大量的时间,却收效甚微。那我们现在来看一下第二种方法,利用java 的反射机制。关于java的反射机制大家可以参考java的文档或者网络
减小字体 增大字体
上一些关于这个方面的文章。这里,我只介绍如何在android里使用。下面看一个例子(将×××的代码复制一下就可以测试了,方法都是上面的)。
try {
Class hideClass = Class.forName("android.os.FileUtils");
//Method hideSubprocess = hidecClass.getMethod("createSubprocess",
// String.class, String.class, String.class, int[].class);
Method[] hideMethod = hideClass.getMethods();
int i = 0;
for (;i < hideMethod.length;i++)
{
Log.i(LOG_TAG,hideMethod[i].getName());
}
Method copyFile = hideClass.getMethod("copyFile", File.class,File.class);
File tmpPackageFile = getFileStreamPath(TMP_FILE_NAME);
if (tmpPackageFile == null) {
Log.w(LOG_TAG, "Failed to create temp file");
return ;
}
if (tmpPackageFile.exists()) {
tmpPackageFile.delete();
}
//this.openFileOutput("", mode);
try {
copyFile.invoke(hideClass.newInstance(), new File("/sdcard/MainActivity.apk"),tmpPackageFile);
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}catch (ClassNotFoundException e) {
//throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (SecurityException e) {
//throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (IllegalArgumentException e) {
//throw new RuntimeException(e.getMessage());
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
其实使用基本上和一般的java reflection没有什么很大的区别。
还有一种整理好的TextFileUtils
package com.my.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
*文本文件常用的创建、写入、读取、删除
*
*@2010-8-19
*@下午03:36:12
*/
public class TextFileUtils {
/**
* 创建Text文件
* @param path
*/
public static void createText(final String path) {
File filename ;
try {
filename = new File(path);
if (!filename.exists()) {
filename.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
}// end method createText()
/**
* 删除Text文件
* @param path
*/
public void deleteText(String path) {
try {
RandomAccessFile file = new RandomAccessFile(path, "rw");
file.setLength(0);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取text内容
* @param path
* @return
*/
public static String readText(String path) {
FileReader fileread;
File filename = new File(path);
String line = null;
try {
fileread = new FileReader(filename);
BufferedReader bfr = new BufferedReader(fileread);
try {
line = bfr.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return line;
}// end method readText()
/**
* 向Text文件中写入内容
* @param body
* @param path
*/
public static void writeText(String content, String path) {
// 先读取原有文件内容,然后进行写入操作
RandomAccessFile mm = null;
File filename = new File(path);
try {
mm = new RandomAccessFile(filename, "rw");
mm.writeBytes(content);
} catch (IOException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
} finally {
if (mm != null) {
try {
mm.close();
} catch (IOException e2) {
// TODO 自动生成 catch 块
e2.printStackTrace();
}
}
}
}// end method writeText()
}
转载于:https://blog.51cto.com/zhaohaiyang/522520
android 反射机制相关推荐
- Android : 反射机制获取或设置系统属性(SystemProperties)
Android.os.SystemProperties 提供了获取和设置系统属性的方法,但是这个类被隐藏了,应用开发时无法直接访问,可以通过反射的机制进行操作. 获取系统属性 public stati ...
- Android反射机制
项目需要,获取系统某个分区的空间不足阈值,比如/data分区.原生Android接口如下: /** 1224 * Return the number of available bytes at whi ...
- Java反射机制实现与原理
本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或 ...
- android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...
想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...
- 【Android】 认识反射机制(Reflection)
什么是反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解
android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解 一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的 ...
- android中通过java的反射机制获取U盘名称
在android项目中实现Windos一样的U盘效果,需监听两个U盘的插入和拔出状态,并屏蔽本地存储,使用U盘来下载和上传文件: 在编辑代码中碰到一个问题:无法获取插入U盘的名称,于是通过java的反 ...
- 【腾讯Bugly干货分享】经典随机Crash之二:Android消息机制
为什么80%的码农都做不了架构师?>>> 本文作者:鲁可--腾讯SNG专项测试组 测试工程师 背景 承上经典随机Crash之一:线程安全 问题的模型 好几次灰度top1.top ...
- java初反射_初始 java 反射机制 (一)
反射机制详解 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为j ...
最新文章
- Redis 笔记(15)— 管道 pipeline(客户端将批量命令打包发送用来节省网络开销)
- 优化自定义函数_10分钟教你手写8个常用的自定义hooks
- Linux软件管理器(如何使用软件管理器来管理软件)
- sentinel里的双检锁
- 曲线积分与曲面积分总结_高数下册||知识点总结
- java时间聚类_mongodb 按照时间聚类 java
- 1034 有理数四则运算 (20 分)java
- C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过)
- 立志做个有激情的coder
- VirtualBox中安装Android-x86详解
- jsp代码编写简单的BBS论坛项目的总结
- 没有自制力的人,有什么资格谈努力?
- nvcc fatal : Unsupported gpu architecture ‘compute_30‘
- 企业口碑营销,如何塑造全网优质口碑
- 产品经理知识框架+求职面经——快手,字节跳动,
- C# 制作贪吃蛇小游戏,最简单的实现
- ITIL学习(六)服务战略之战略制定
- Picsew | 推荐一款长截图和长图拼接工具
- 【计算机-虚拟wifi】Win7虚拟wifi设置
- 路由器是不是坏了的方法
热门文章
- 前端架构八大设计准则
- 华为手机怎么找回桌面计算机,华为手机界面文件夹消失如何恢复
- 小程序setdata优化_支付宝小程序扩展能力 附录 1:优化 setData 逻辑方案明细
- 三角形面积,周长的计算(C++)
- 入门到入魂:单片机如何利用TB6600高精度控制步进电机(42/57)
- 阿里平头哥无剑100SOCwujian100挂UART外设之①将无剑100下载到gensys开发板
- 正规式和有限自动机(转自csdn)
- Android11 SystemUI 下拉通知栏取消左右滑动菜单
- java filenotfoundexception类_java.io.FileNotFoundException:没有此类文件或目录错误
- AC500 基于 Profinet 通讯连接变频器