java 方法中含有 transient 是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 方法中含有 transient 是啥意思?相关的知识,希望对你有一定的参考价值。

public static <T> List<Map<String,Object>> returnMapList(List<T> list,String ...fields) throws Exception;
本来是这样的,编译后编程下面那样了
public static transient List returnMapList(List list, String fields[])throws Exception

我用的是一个非序列化的类,使用了java的method.invoke(Object,Object[]);方法.
我在网上查询了 transient ,说是序列化的时候,该值不进行序列化.但是这个是方法啊?
为什么呢.大侠们,求个解释,先谢了

“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”。
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。

如定义类:
public class People implements Serializable
private static final long serialVersionUID = 8294180014912103005L;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private transient String password;


密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。

以下例子展示了这个行为:
public static void main(String[] args) throws Exception
People p = new People();
p.setUsername("snowolf");
p.setPassword("123456");

System.err.println("------操作前------");
System.err.println("username: " + p.getUsername());
System.err.println("password: " + p.getPassword());

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"people.txt"));
oos.writeObject(p);
oos.flush();
oos.close();

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"people.txt"));
p = (People) ois.readObject();

ois.close();

System.err.println("------操作后------");
System.err.println("username: " + p.getUsername());
System.err.println("password: " + p.getPassword());

执行结果是:
------操作前------
username: snowolf
password: 123456
------操作后------
username: snowolf
password: null
参考技术A 查了好久,没有发现 transient修饰方法时什么意思。
干脆自己在Eclipse试试:
public class Test
public static transient List returnMapList(List list, String fields[])
throws Exception
return null;


很有意思,直接提醒错误:
Illegal modifier for the method returnMapList; only public, protected, private, static, final, abstract, synchronized & native are permitted。
说只有public, protected, private, static, final, abstract, synchronized & native 这些关键字可以修饰这个方法。
看来咱们都别费那个劲了,貌似钻进死胡同了。看楼主的描述,也不是正规途径写出的代码,不定什么原因造成的呢。就此给分结贴吧,呵呵。追问

List> mapList = new ArrayList>();
for(T t : list)
Method m = t.getClass().getMethod("returnMapObject",fields.getClass());
Object result = m.invoke(t,(Object)fields);
mapList.add((Map) result);

return mapList;
方法内容是这个,我把class反编译后,才有transient,有兴趣不妨再看看

追答

反编译出来的东西,不可信。尤其是复杂的东西,比如反射。

本回答被提问者采纳
参考技术B 该方法不被序列化有什么问题吗?追问

我猜测大概也是这个意思,但是这个类,我并没有实现序列化接口...
其次序列化不是作用在 对象的属性值上面吗?
方法不被序列化是什么意思,

Java中静态最终瞬态的作用是啥?

【中文标题】Java中静态最终瞬态的作用是啥?【英文标题】:What is the effect of static final transient in Java?Java中静态最终瞬态的作用是什么? 【发布时间】:2016-05-07 03:44:15 【问题描述】:

在我正在处理的代码库中,几乎所有声明为 static final String 的变量也声明为 transient

所以我有这样的字段:

public static final transient String VERSION = "1.0";

每当我发现这些 transient 关键字时,我都想删除它们,因为我认为它没有任何用途。

在这种情况下使用transient 与不使用之间的行为有什么不同吗?

【问题讨论】:

我假设您特别指的是与final 的组合,所以***.com/questions/4565653/… 不会是合理的重复,对吧? 请看这里 :) transient variables – Ruthi Ruth 到底谁使用序列化?删除所有瞬变! :) 我的问题是为什么你有这些 VERSION 变量。我的猜测是,它们在创建类时被硬编码为“1.0”,然后在之后的几年里保持不变。如果您问我,请删除整个内容。 @Tobb:版本只是一个例子。它基本上用于所有字符串常量 【参考方案1】:

变量上的transient 关键字将确保在序列化时该变量不是序列化对象的一部分。如果您的类不是serializable,也不是JPA 实体(它使用transient 关键字来避免在数据库中存储变量),删除它应该没问题。

【讨论】:

这些类中的大多数都实现了 Serializable 好的,正如其他答案所述,静态成员无论如何都不会序列化。 ***.com/questions/11000975/…【参考方案2】:

static 字段隐含为transient(序列化static 字段时,它的值无论如何都会丢失)。所以确实,不需要同时声明两者。

【讨论】:

如果你能添加一个来源会很棒,但无论如何它看起来都是正确的答案。 当您说值丢失时,该字段是否是没有值的序列化的一部分(例如 null),还是该字段永远不会作为属性?【参考方案3】:

静态成员与不与对象关联的类关联,因此在反序列化时,您将看到您传递的值,而不是使用瞬态时显示的默认值。 为了更好地理解,尝试在序列化之后更改变量的值,然后在反序列化时,您会看到序列化成员的值是相同的,但静态成员的值已经改变。 根据 transient final ,final 变量确实通过它们的值直接参与序列化,因此没有使用将 final 变量声明为瞬态。

【讨论】:

我可能遗漏了一些东西,但我看不出这对接受的答案有什么影响。

以上是关于java 方法中含有 transient 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

java中的关键字transient是啥意思

java 中的修饰符transient是啥意识他的原理是啥?

Java中静态最终瞬态的作用是啥?

Java中transient关键字

transient-java 关键字

Java中transient关键字的详细总结