什么是paaas须眉尽白 伛偻其身交白ant?

在MyEclipse中的ant是做什么用的? 在什么情况下使用ant? - 知乎4被浏览1544分享邀请回答1添加评论分享收藏感谢收起1添加评论分享收藏感谢收起&&&&& 哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始:
1. transient的作用及使用方法
&&&&& 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
&&&&& 然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
&&&&& 总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
示例code如下:
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
* @description 使用transient关键字不序列化某个变量
注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致
* @author Alexia
public class TransientTest {
public static void main(String[] args) {
User user = new User();
user.setUsername("Alexia");
user.setPasswd("123456");
System.out.println("read before Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:/user.txt"));
os.writeObject(user); // 将User对象写进文件
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:/user.txt"));
user = (User) is.readObject(); // 从流中读取User的数据
is.close();
System.out.println("\nread after Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
class User implements Serializable {
private static final long serialVersionUID = 2103005L;
private transient S
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPasswd() {
public void setPasswd(String passwd) {
this.passwd =
read before Serializable:
username: Alexia
password: 123456
read after Serializable:
username: Alexia
password: null
密码字段为null,说明反序列化时根本没有从文件中获取到信息。
2. transient使用小结
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
第三点可能有些人很迷惑,因为发现在User类中的username字段前加上static关键字后,程序运行结果依然不变,即static类型的username也读出来为&Alexia&了,这不与第三点说的矛盾吗?实际上是这样的:第三点确实没错(一个静态变量不管是否被transient修饰,均不能被序列化),反序列化后类中static型变量username的值为当前JVM中对应static变量的值,这个值是JVM中的不是反序列化得出的,不相信?好吧,下面我来证明:
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.FileOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
* @description 使用transient关键字不序列化某个变量
注意读取的时候,读取数据的顺序一定要和存放数据的顺序保持一致
* @author Alexia
public class TransientTest {
public static void main(String[] args) {
User user = new User();
user.setUsername("Alexia");
user.setPasswd("123456");
System.out.println("read before Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream("C:/user.txt"));
os.writeObject(user); // 将User对象写进文件
os.flush();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
// 在反序列化之前改变username的值
User.username = "jmwang";
ObjectInputStream is = new ObjectInputStream(new FileInputStream(
"C:/user.txt"));
user = (User) is.readObject(); // 从流中读取User的数据
is.close();
System.out.println("\nread after Serializable: ");
System.out.println("username: " + user.getUsername());
System.err.println("password: " + user.getPasswd());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
class User implements Serializable {
private static final long serialVersionUID = 2103005L;
public static S
private transient S
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPasswd() {
public void setPasswd(String passwd) {
this.passwd =
运行结果为:
read before Serializable:
username: Alexia
password: 123456
read after Serializable:
username: jmwang
password: null
这说明反序列化后类中static型变量username的值为当前JVM中对应static变量的值,为修改后jmwang,而不是序列化时的值Alexia。
3. transient使用细节&&被transient关键字修饰的变量真的不能被序列化吗?
思考下面的例子:
import java.io.E
import java.io.F
import java.io.FileInputS
import java.io.FileOutputS
import java.io.IOE
import java.io.ObjectI
import java.io.ObjectInputS
import java.io.ObjectO
import java.io.ObjectOutputS
* @descripiton Externalizable接口的使用
* @author Alexia
public class ExternalizableTest implements Externalizable {
private transient String content = "是的,我将会被序列化,不管我是否被transient关键字修饰";
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(content);
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
content = (String) in.readObject();
public static void main(String[] args) throws Exception {
ExternalizableTest et = new ExternalizableTest();
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
new File("test")));
out.writeObject(et);
ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
"test")));
et = (ExternalizableTest) in.readObject();
System.out.println(et.content);
out.close();
in.close();
content变量会被序列化吗?好吧,我把答案都输出来了,是的,运行结果就是:
是的,我将会被序列化,不管我是否被transient关键字修饰
这是为什么呢,不是说类的变量被transient关键字修饰以后将不能序列化了吗?
&&&&& 我们知道在Java中,对象的序列化可以通过实现两种接口来实现,若实现的是Serializable接口,则所有的序列化将会自动进行,若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。因此第二个例子输出的是变量content初始化的内容,而不是null。
阅读(...) 评论()prevelant是什么意思_在线翻译、解释、发音、同义词、反义词_英语单词大全_911查询
prevelant是什么意思
输入英文单词或中文词语查询其翻译
prevelant是什么意思 prevelant在线翻译 prevelant什么意思 prevelant的意思 prevelant的翻译 prevelant的解释 prevelant的发音 prevelant的同义词
prevelantprevelant 双语例句1. danci.911cha.com1. The only reason I bring that up is just'cause it's prevelant, it's just...&&&&我说这个的唯一原因是因为这是普遍现象,只是。。。2. Hindi is understood by almost everyone and English is prevelant to a lesser extent.&&&&几乎所有人都明白印地语和英语是为了prevelant程度较轻。3. Hate is something that Bible believers understand will become more prevelant in our world as we near the end of times.&&&&恨一点圣经信徒将会更加了解我们世界prevelant我们接近尾声的时候。4. Affordable decent housing is different from in-kind housing supply system which was prevelant in planning- it is also distinct from commercial housing which is used for consuming and investing.&&&&经济适用住房不同于计划经济时期主要用于解决生存问题的实物分配性住房,也不同于融消费性、投资性完全于一体的商品房。5. Especially after the World War Two, with the baby boomers having kids and the automobile bec oming prevelant, the great American vacation (×with— was) to pack everybody in the car, head across the country, and see the great national parks.&&&&尤其是二战以后,婴儿潮那一代人都有了自己的孩子,汽车的使用更加普遍,美国人出游的方式就是全家人坐在车里,前往国家公园。6. The isolation of TAHV from southern region of Xinjiang indicated this virus prevelant in local area and no isolation from northern region of Xinjiang indicated that this virus may not active there.&&&&这些结果提示,新疆地区存在多种蚊传黄病毒属虫媒病毒,并有可能引起夏季人群不明原因发热等疾病。prevelant是什么意思,prevelant在线翻译,prevelant什么意思,prevelant的意思,prevelant的翻译,prevelant的解释,prevelant的发音,prevelant的同义词,prevelant的反义词,prevelant的例句,prevelant的相关词组,prevelant意思是什么,prevelant怎么翻译,单词prevelant是什么意思常用英语教材考试英语单词大全 (7本教材)
出国英语单词大全 (5本教材)
大学英语单词大全 (13本教材)
高中英语单词大全 (6本教材)
初中英语单词大全 (13本教材)
小学英语单词大全 (33本教材)
别人正在查
911查询 全部查询 网址:
(共20个)占卜求签
(共17个)民俗文化
(共16个)交通出行
(共10个)学习应用
(共26个)休闲娱乐
(共10个)站长工具
(共8个)身体健康
&2017  京ICP备号-6 京公网安备30 &&&&&&&&&&&&&&&&&&
posts - 151,comments - 52,trackbacks - 0
  Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了。
1 &Ant自动编译打包android项目
& & &1.1 & Ant安装
  ant的安装比较简单,下载ant压缩包 & &(最新的为1.9.3版本),下载之后将其解压到某个目录(本人解压到E:\Program Files\apache-ant-1.9.3) ,然后配置环境变量(新建ANT_HOME环境变量,值为ant所在的目录,然后将ANT_HOME/bin添加到path中),如图:& & & &&
  打开命令行工具,输入 ant &-version ,如果出现如下结果,说明ant 安装成功。
 &1.2 & 为Android项目生成Ant配置build.xml
  打开命令行工具,切换路径到项目所在的目录;输入命令
  android update project --name &project_name& --target &target_ID&--path &path_to_your_project&
  项目根目录下多了build.xml,以及local.properties两个文件。
  其中local.properties写明了我们的android SDK的目录(其实是环境变量ANDROID_HOME的值,所以如果环境变量中没有这个的,请增加)。
  build.xml则是ant构建的最重要脚本,打开一看,发现里面其实大部分都是写注释,有用的没几行,这是因为生成的这个build.xml引用了android SDK自带的构建脚本,具体目录是{sdk目录}/tools/ant/build.xml 。
&  这样,项目就支持ant编译打包了,但是,有人可能会说了,我的项目有引用第三方的jar包,而且还引用了其他的android library 项目,该怎么办呢?
& & &1.3 & android使用ant打包时,添加第三方jar包
& & &1.3.1 &libs 库中的第三方jar包
  如果项目只是引用了第三方jar包,只要将jar包放在libs文件夹下就ok了,ant会在编译打包过程中会自动将第三方jar加进去的。但是当我们的android 项目参考了其他library项目,这时候我们最初在输入android update 命令的时候应该多一个参数 --subprojects :&
  你发现报错了,不要着急,这是因为那个library 还不支持ant自动编译,我们需要先让它也支持。
  进入到library项目所在的目录,输入命令 android update lib-project -p ./ &(注意是 lib-project);
&  再回到原项目,输入命令&&android update project --name MenudrawSample -p ./ --subprojects ",这下就OK了。
& & & 1.3.2 &user library库中第三方jar包
  在Android开发中,除了通常在Eclipse中的编译方法之外,有的时候为了进行持续集成,可能还需要用ant进行自动化编译。Android SDK本身已经提供了默认的ant编译脚本,就在每个工程下的build.xml中,其中引用了SDK的编译脚本${sdk_dir}/tools/ant/build.xml 。
  通常情况下,在工程根目录下直接执行 ant debug 即可进行一次正常的build。默认的classpath会包括libs目录下的所有jar文件。但是如果工程中使用了USER LIBRARY,或者引用了外部的jar文件,那么在编译中就可能会遇到问题,因为USER LIBRARY等这些jar文件不会被自动包含在classpath中,这时就要扩展ant的path变量,把自己的jar文件加入到classpath中。
  通过察看sdk提供的build.xml编译脚本,可以发现javac使用的classpath定义如下:
&path id="project.javac.classpath"&
&path refid="project.all.jars.path"&&/path&
&path refid="tested.project.classpath"&&/path&
&javac encoding="${java.encoding}"
source="${java.source}" target="${java.target}"
debug="true" extdirs="" includeantruntime="false"
destdir="${out.classes.absolute.dir}"
bootclasspathref="project.target.class.path"
verbose="${verbose}"
classpathref="project.javac.classpath"
fork="${need.javac.fork}"&
&src path="${source.absolute.dir}"&&/src&
&src path="${gen.absolute.dir}"&&/src&
&compilerarg line="${pilerargs}"&&/compilerarg&
  其中 project.all.jars.path 包含了所有的jar文件,我们可以通过在工程目录下的build.xml中重新定义这个变量来引入其他的jar文件。
  例如在我的工程中,引用了ormlite这个ORM库,为了能够在开发中使用&attach source&察看源码,该jar文件不能放在libs目录中,因为Eclipse不允许对libs目录中的jar文件&attach source&。
  因此我将此文件放到了libs/ormlite目录中,为了能够将这两个jar文件加入到classpath中,就要重新定义 project.all.jars.path 这个元素。
  基本思路是,重新定义 -pre-compile这个target,在其中重新定义 project.all.jars.path 的值。
  这段代码写在哪里呢?在每个项目的build.xml中引用了当前目录下的custom_rules.xml,那么我们就在项目根目录下创建一个custom_rules.xml,内容如下:
&?xml version="1.0" encoding="UTF-8"?&
&project name="custom_rules" default="release"&
&target name="-pre-compile"&
&echo message="JARPATH=${toString:project.all.jars.path}"&&/echo&
&echo message="JARPATH=${jar.libs.dir}"&&/echo&
&property name="ormlite.dir" value="${jar.libs.dir}/ormlite"& &/property&
&path id="ormlite.lib"&
&path path="${toString:project.all.jars.path}"&&/path&
&pathelement location="${ormlite.dir}/ormlite-android-4.41.jar"&&/pathelement&
&pathelement location="${ormlite.dir}/ormlite-core-4.41.jar"&&/pathelement&
&path id="project.all.jars.path"&
&path refid="ormlite.lib"&&/path&
&echo message="JARPATH=${toString:project.all.jars.path}"&&/echo&
&/project&
& & & 1.4 & 编译打包项目
  ant debug: 生成一个测试版apk,默认使用 debug key 进行签名,生成的apk(your_project_name-debug.apk)在bin目录下。
  ant release: 生成一个未签名和未aligned的apk包, project_name-release-unsigned.ap和project_name-release-unaligned.apk 在bin目录下。
2 &&签名与渠道包
  基于ant自动编译打包现有的android项目,可以在ant打包应用的时候加入签名信息以及自动打包渠道包。
& & &2.1 &加入签名信息
  在项目的根目录下建一个ant.properties文件,输入如下内容,其中keystore密码和alias密码可以不指定(防泄漏),那么在命令执行的过程中会要求你输入。
#keystore的路径,必须使用正斜杠
key.store= "E:/wp_android_sample/me.key"
#keystore的密码
#key.store.password=*****
key.alias=me
#alias密码
#key.alias.password=******
  在项目根目录下运行 ant release 命令就会帮你生成一个经过签名和aligned的apk,生成的apk(your_project_name-release.apk)在bin目录下
& & &2.2 & 自动打包渠道包
  实现批量循环打包需要一个类似于for循环的功能,在Ant的核心包里没有相关的For循环的Task,即不支持for循环,但是ant支持第三方扩展包,以支持更多的其他功能。
  于是我们要下载相应的支持for循环的扩展包。可以使用开源的Ant-contrib包。下载地址:&。
  下载后的解压得到的jar文件放到ant的lib目录。接下来我们就可以打包渠道包了,具体做法是:
  (1) 首先在ant.properties文件中增加属性&market_channels (渠道列表,以逗号分割),version(应用程序版本名)
#渠道市场列表
market_channels=91,360,wandoujia,baidu
version=1.2.1
  (2) &在我们项目的build.xml中加入如下代码:
&!-- 渠道包打包脚本
ant deploy--&
&taskdef resource="net/sf/antcontrib/antcontrib.properties"&
&classpath&
&pathelement location="lib/ant-contrib-1.0b3.jar"/&
&/classpath&
&/taskdef&
&target name="deploy"&
&foreach target="modify_manifest" list="${market_channels}" param="channel" delimiter=","&
&/foreach&
&target name="modify_manifest"&
&replaceregexp flags="g" byline="false"&
&!-- 匹配的内容是 android:value="*****" android:name="UMENG_CHANNEL" --&
&regexp pattern='android:value="(.*)" android:name="UMENG_CHANNEL"' /&
&!-- 匹配之后将其替换为 android:value="渠道名" android:name="UMENG_CHANNEL" --&
&substitution expression='android:value="${channel}" android:name="UMENG_CHANNEL"' /&
&!-- 正则表达式需要匹配的文件为AndroidManifest.xml --&
&fileset dir="" includes="AndroidManifest.xml" /&
&/replaceregexp&
&property name="out.release.file" location="${out.absolute.dir}/${ant.project.name}_${channel}.apk" /&
&!--包 --&
&antcall target="release" /&
&!--输出渠道包到bin/out目录下 --&
&copy tofile="${out.absolute.dir}/out/${ant.project.name}v${version}-${channel}.apk" file="bin/${ant.project.name}-release.apk"/&
  在项目根目录下运行 ant deploy 命令就会帮你各个渠道的签名包了(为了全程可以自动执行,ant.properties文件中的keystore的密码可以指定,这样在执行过程中就不需要手动输入密码了),在bin目录的out目录下。
阅读(...) 评论()

我要回帖

更多关于 白色相簿2as 的文章

 

随机推荐