导航:首页 > 编程语言 > java枚举的反射

java枚举的反射

发布时间:2022-08-04 15:46:51

1. java中枚举怎么遍历

我们可以通过反射, 以及枚举类的静态方法values()来进行遍历:
代码:
enum Rating {
UNRATED, G, PG, PG13, R, NC17
}
public class Test {
public static void main(String args[]) {
System.out.println("第一种通过反射");
Class clz = Rating.class;
for (Object obj: clz.getEnumConstants()) {
System.out.println(obj);
}
System.out.println("第二种通过枚举静态方法values()");
for (Rating rate: Rating.values()) {
System.out.println(rate);
}
}
}
运行结果:
第一种通过反射
UNRATED
G
PG
PG13
R
NC17
第二种通过枚举静态方法values()
UNRATED
G
PG
PG13
R
NC17

2. java 枚举类 静态昏了!

SPRING不是一个新类,它是SeasonEnum的一个实例。你的定义里面Season有且只有4个对象(不可能再实例化出新的了)就是SPRING,SUMMER,FALL,WINTER。
将print方法改为:
public void print(){
System.out.println(this.getClass());
}
打印出来的肯定是class xxx.xxx.SeasonEnum。

可以按照你下面写的Season类来“理解”Enum。Enum其实就是一个不能动态实例化新对象的类。
你下面写的Season类通过反射可以调用private构造方法来实例化对象,但是Enum定义完毕后就绝对不可能再实例化出新对象(除了你已经定义好的如SPRING、SUMMER)。

另外:不是把SPRING,SUMMER,FALL,WINTER"当成"SeasonEnum的实例,它们本来就是SeasonEnum的实例。

3. 为什么java中用枚举实现单例模式会更好

枚举本身就是单例模式。 避免了反射和反序列化的漏洞。 调用的效率比较高,线程安全,实现简单。 唯一的缺点是没有实现延时加载。

4. Java中什么是对象什么是引用还有枚举,求大佬解决最好用表达式。

如果你是初学者,我用最好理解的方式跟你说.

对象:就是一个名词而已,没啥特别的,学过C语言么?学过C语言的话,结构体,就是对象.

如果没学过C,我再找一个方式给你说.不过要说对象,得先说类.

在JAVA中,有一种数据结构,

Classstudent{
Stringname;
voidshowname(){
System.Out.print(this.name)
}
}

这就是这种数据结构,JDK也会提供很多,系统给你写好的,这个是我程序员自己写的学生类,我们定义了一种学生类,我觉得学生应该有名字属性,还应该有一个让别人知道他名字的能力,所以,他有了名字,有了说出名字的能力,都是我写的,你觉得学生还应该有性别,你就加进去,别赋值.因为学生应该有性别,但不该固定死,你说学生就该是男的么?或者就该是女的?不可能,所以你可以说学生有性别这个属性,但是他到底是什么,我不知道,所以你定义类,不能赋值.

那这是我觉得学生类,所有学生都该这样.

而类跟个体有什么区别呢?这就像你和人类的关系,类有大的方向性的东西,只有个体有具体的特色.

那么个体怎么展现他的特性呢?

还拿这个Student类来说,这个类是大方向,代表所有学生都有名字和说出名字的能力,但具体个体,比如你叫张伟,

那么

Studentzhangwei=newStudent("zhangwei");

就是通过new关键字,从学生类,创建出来一个真真实实的叫张伟的个体.

那么这个张伟就是对象,所有由new关键字,从类中创建的个体就叫对象.

现在明白什么叫对象了么?

下面说引用,如果你是一个初学者,我希望你只听我说的第一部分.

int number=123;

这就是一个引用,你这条代码,执行后,会在存储空间开辟一个小单元,里面放着123这个实际数据.

那么你想使用这个数据,怎么办呢?你不知道这个小单元的位置啊,怎么用呢?Java和所有编程语言都如此,会给你提供一种方案,那就是,给这个单元起个名字,这个单元就叫number,以后你代码中再写number,我知道去哪个小单元找数据.

而这个number就是在123这个数据单元的引用.或者number引用123这个单元,说起来,中文有点绕,你怎么说好像都对,反正你明白这个意思就行.就是一个东西等价另一个东西,这就是一个队另一个的引用.

这是第一部分,如果你是初学者,听到这里就可以了,如果你是想钻研深度的,下面的继续,

Java中有四种引用,分别为强引用,软引用,弱引用,虚引用.我再强调一遍啊,如果你是新手,别看这部分.容易让你乱.

强引用::::::说起来也容易理解,强引用,就是我刚才写的int number=123这个代码,这就是强引用,我写了这代码,虚拟机运行时,发现,卧槽,内存不够了啊,这可怎么办?要不,我偷偷的,不给你分配内存存储123?也不告诉你?不行!!!虚拟机如果发现内存不够了,就会停止运行,告诉你报错了,内存不够.因为你写的这个代码叫强引用型,特点就是必须要引用成功.

软引用::::那么这是什么,这也是一种引用类型,目的就是,告诉虚拟机,啊,你运行吧,我要创建int number=123,但是,我允许你在出现内存不足时,释放123这个空间,不用担心我不让,我同意了,你可以在内存不足时删掉我.

这就是软引用,那具体怎么实现呢?

intnumber=123;
SoftReferenceruanyinyong=newSoftReference(number);
number=null;
ruanyinyong=get();

这段代码就是在创建一个软引用,首先第一行肯定是一个硬引用,就是,无论你内存够不够,你必须给我创建数据.

第二行通过系统提供的创建软引用的类,来为你创建一个软引用,就是将number等价的存到ruanyinyong这个变量中.

第三行,释放number这个硬引用为弱引用(后面说),就是告诉系统,number现在不是硬引用了,你可以删除我了.但是,不幸的是,number在第二行已经重新扔给了ruanyinyong.

现在ruanyingyong就出现了.懂么?

弱引用:::::下面是弱引用,弱引用在刚才说了一嘴,什么是弱引用呢?弱引用就是比软引用还低级的引用方式,软引用是内存不足,才会删除,弱引用是内存不管你足不足,我虚拟机垃圾回收器只要在周期性扫描垃圾的时候发现你小子了,你就给我玩蛋去.

怎么达成弱引用呢?那就是使用number=null这种方式,来释放内存,其实这就是弱引用了,你必须通过=null的方式来告诉虚拟机,这个数据没用了.但是注意,虚拟机的垃圾回收期是周期性扫描的,也就是说,你虽然写了=null,但是他不一定立刻删除,需要扫描到你的时候,才会删除.但是,你还要注意一点,那就是,虽然还没删除,但是引用已经断开了,人家没删除指的是具体数据单元的数据123没删除,而不是说你这个引用number没删除,其实即使你的123没删除,但是number的引用的那根线已经切断了,你也无法通过number去引用了.

虚引用::::唉呀妈呀,你这也没个悬赏,我可是一个字一个字给你手写的,就看你爱学,喜欢认真研究的人,才给你写的,你要不好好看,多对不起啊.

虚引用我不是很清楚,这个你自己网络下吧,我也查过了,不是很看的懂,所以没法用自己的语言给你解释了.

最后最后最后,你的枚举是吧.

枚举,我还真把JAVA源代码给反编译成汇编看过,枚举其实就是一个Class类,特殊的类.

你反编译,看代码,发现它也是类,可是为啥特殊呢?

这个没法有通俗易懂的语言,我也没法按你是新手或者老手不同解释,这就一个解释,不懂,你就去看明白啥是类就行了.

我给你描述一个类:

构造器是私有化的,类中的属性只有get方法,没有set 方法,而且所有属性都是静态的最终的,这样子的类,就是枚举类型.

为啥呢?因为枚举嘛,本意就是不想让你再创建新的对象,只让你使用他枚举列表里提供的常量,那么私有化构造器,你就无法使用new调用构造器去创建新对象了.而保证成员属性不可变,那就是不提供set方法,只有get方法.而属性是最终的finall类型的,也进一步禁止你修改属性.

所以你只能用他提供的,不能自己去构造,修改任何数据.这就是枚举.

这个类其实就是枚举了.但是这个我们写出来的模仿出来的枚举,跟真正的枚举类是差不多的,只差一点,我们写的这个,可以通过反射的形式,创建对象,而我们当初设计枚举时,可一定一定一定不允许用户创建新的或者修改数据啊,你只能用,不能创建啊!那怎么办?没事,你自己模仿的枚举不行,我系统提供一个,枚举类,连反射都无法创建对象,看你怎么办?所以我们写的,跟系统提供的区别仅在于,我们的通过常规手段创建不了,但是反射能创建,而系统提供的,反射都无法创建对象.

那么你会发现,卧槽,这个特性很符合我们26中设计模式中的"单例模式"的需求啊,设计单利模式不也是需要私有化构造器,然后提供一个不可变的,静态的对象么?这个算是扩展,你了解单例模式,再说,其实现实中就有很多人用枚举来完成单例模式,代码更优雅,更安全,更美观,我就这么干....

阅读全文

与java枚举的反射相关的资料

热点内容
红塔银行app怎么样 浏览:562
农行app怎么开网银 浏览:649
java迭代器遍历 浏览:301
闽政通无法请求服务器是什么 浏览:48
怎么做积木解压神器 浏览:203
王者荣耀解压玩具抽奖 浏览:49
12位是由啥加密的 浏览:868
程序员编迷你世界代码 浏览:895
php取现在时间 浏览:246
单片机高吸收 浏览:427
怎么区分五代头是不是加密喷头 浏览:244
hunt测试服务器是什么意思 浏览:510
2013程序员考试 浏览:641
毕业论文是pdf 浏览:736
服务器跑网心云划算吗 浏览:471
单片机定时器计数初值的计算公式 浏览:801
win7控制台命令 浏览:567
猫咪成年app怎么升级 浏览:692
360有没有加密软件 浏览:315
清除cisco交换机配置命令 浏览:751