已有101人关注
Java第16章 反射 构造函数修饰符问题
发表在Java图书答疑 2016-05-31
是否精华
版块置顶:
为什么没有被修饰为private和protected的构造函数会有transient修饰符修饰,但是显示的使用transient修饰符时又提示非法修饰符?

测试代码如下:

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class Test {

public static void main(String[] args) {
Constructor<?>[] cons=Example.class.getDeclaredConstructors();
System.out.println("构造方法修饰符分别为:");
for(int i=0;i<cons.length;i++){
int modifier=cons[i].getModifiers();
System.out.println(Modifier.toString(modifier));
}
}

}

class Example{
private Example(){}
protected Example(String s,int i1){}
Example (int...i){}
public Example(String...str){}
// transient Example (int i){} //不可以直接显示的使用transient修饰符
}

运行结果如下:

构造方法修饰符分别为:
public transient
transient
protected
private
分享到:
精彩评论 4
西瓜_mrkj
学分:0 LV1
2016-05-31
沙发
我自己查了一下资料 transient是声明不用序列化的成员域,序列化的作用是使用对象流进行输入或输出,我上面的测试代码中因为参数数目是可变的,所以才被虚拟机自动定义了transient修饰符。那么为什么参数可变的方法不能序列化呢? 

另外如果类没有声明构造函数的话,getDeclaredConstructors()方法不能返回由虚拟机默认构造的无参数构造函数,也就是说这个方法只能返回显示声明的构造函数,我这样理解正确吗?
西瓜_mrkj
学分:0 LV1
2016-05-31
板凳
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
我自己查了一下资料 transient是声明不用序列化的成员域,序列化的作用是使用对象流进行输入或输出,我上面的测试代码中因为参数数目是可变的,所以才被虚拟机自动定义了transient修饰符。那么为什么参数可变的方法不能序列化呢? 

另外如果类没有声明构造函数的话,getDeclaredConstructors()方法不能返回由虚拟机默认构造的无参数构造函数,也就是说这个方法只能返回显示声明的构造函数,我这样理解正确吗?
[/FIELDSET]

下面的代码运行没有异常,就是文件word的内容是乱码,这个好像又说明transient修饰了再序列化也没问题啊,已经被自己弄晕了,请老师指点迷津。

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test {
public static void main(String[] args){
try(ObjectOutputStream oos=
new ObjectOutputStream(new FileOutputStream("D:/word.txt",true))){
oos.writeObject(new Example("Hello","世界"));
}
catch(Exception e){
e.printStackTrace();
}
}
}

class Example implements Serializable{
String[] s;
String info;
public Example(String...s) {
this.s=s;
}
public String toString(){
for(String str:s){
info+=str;
}
return info;
}
}
静心_mrkj
学分:0 LV1
2016-06-01
地板
抱歉,由于我对这方面的知识涉猎不足,所以不能给你准确的答复。但附件中有个文档,名为“transient修饰符的使用”,里边有源码和说明,希望它能够帮到你。
西瓜_mrkj
学分:0 LV1
2016-06-01
4L
[FIELDSET][LEGEND]引自:3楼[/LEGEND]
抱歉,由于我对这方面的知识涉猎不足,所以不能给你准确的答复。但附件中有个文档,名为“transient修饰符的使用”,里边有源码和说明,希望它能够帮到你。
[/FIELDSET]

回复:
  谢谢老师,附件内容很详细,另外序列化的相关知识我也查资料弄明白了。
首页上一页 1 下一页尾页 4 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照