Java基础加强之不可变类、枚举、反射等
Java中的反射机制详解

Java中的反射机制详解Java作为一种编程语言,具有许多强大的特性和功能。
其中,反射机制是其中的重要部分之一。
通过反射机制,Java程序可以在运行时动态地获取类的信息、构造对象、调用方法和访问属性等。
本文将详细介绍Java中的反射机制。
一、什么是反射机制?Java中的反射机制指的是在程序运行时动态获取类的信息并对其进行操作的能力。
通过反射机制,Java程序可以在运行时获取类的属性、方法和构造器等信息,并对其进行操作。
利用反射机制可以实现动态代理、框架开发、自动化测试等功能。
二、反射机制的基本原理Java程序在编译时会将类的信息编译成.class文件。
在程序运行时,JVM会将.class文件加载到内存中,并生成一个Class对象,该对象包含了类的所有信息。
通过Class对象,Java程序可以获取类的构造器、方法、属性等信息,并对它们进行操作。
三、反射机制的使用Java中的反射机制主要通过ng.reflect包中的类和接口实现。
在这个包中,最常用的类包括Class、Constructor、Method和Field等。
下面我们将分别介绍这些类的用法。
1、Class类Class类是Java中用来表示类的类。
在Java程序中,每个类都有一个对应的Class对象,可以使用该对象获取类的信息。
获取Class对象有以下三种方式:(1)使用类的.class属性获取:Class clazz = MyClass.class;(2)使用Class的forName()方法获取:Class clazz = Class.forName("com.example.MyClass");(3)使用对象的getClass()方法获取:MyClass obj = new MyClass();Class clazz = obj.getClass();通过Class对象可以获取类的信息,如:(1)类的名称:String name = clazz.getName(); // com.example.MyClass(2)类的简单名称:String simpleName = clazz.getSimpleName(); // MyClass(3)类的包路径:Package pkg = clazz.getPackage(); // com.example(4)类的修饰符:int modifiers = clazz.getModifiers(); // 返回访问修饰符列表(5)类的父类:Class superClass = clazz.getSuperclass(); // 返回父类的Class对象2、Constructor类Constructor类用于描述类的构造器。
JAVA反射机制详解

反射概述1反射的概述1.1什么是反射每个.class文件被加载到内存后都是一个Class类的对象!例如Demo.class加载到内存后它是Class<Demo>类型的一个对象。
反射就是通过Class对象获取类型相关的信息。
一个Class对象就表示一个.class文件,可以通过Class对象获取这个类的构造器、方法,以及成员变量等。
反射是Java的高级特性,在框架中大量被使用!我们必须要了解反射,不然无法学好JavaWeb 相关的知识!1.2反射相关类与反射相关的类:●Class:表示类;●Field:表示成员变量;●Method:表示方法;●Constructor:表示构造器。
2Class类2.1获取Class类获取Class类的三种基本方式:●通过类名称.class,对基本类型也支持;Class c = int.class;Class c = int[].class;Class c = String.class●通过对象.getClass()方法Class c = obj.getClass();●Class.forName()通过类名称加载类,这种方法只要有类名称就可以得到Class;Class c = Class.forName(“cn.itcast.Demo”);2.2Class类的常用方法●String getName():获取类名称,包含包名;●String getSimpleName():获取类名称,不包含包名;●Class getSupperClass():获取父类的Class,例如:new Integer(100).getClass().getSupperClass()返回的是Class<Number>!但new Object().getSupperClass()返回的是null,因为Object没有父类;●T newInstance():使用本类无参构造器来创建本类对象;●boolean isArray():是否为数组类型;●boolean isAnnotation():是否为注解类型;●boolean isAnnotationPresent(Class annotationClass):当前类是否被annotationClass注解了;●boolean isEnum():是否为枚举类型;●boolean isInterface():是否为接口类型;●boolean isPrimitive():是否为基本类型;●boolean isSynthetic():是否为引用类型;2.3通过反射创建对象3ConstructorConstructor表示一个类的构造器。
java枚举类型 变长参数 和反射机制的一些说明

枚举类型是JDK5.0的新特征。
Sun引进了一个全新的关键字enum来定义一个枚举类。
下面就是一个典型枚举类型的定义:public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN }显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类。
而这些类都是类库中Enum类的子类(ng.Enum<E>)。
它们继承了这个Enum中的许多有用的方法。
下面我们就详细介绍enum定义的枚举类的特征及其用法。
(后面均用Color举例)1、Color枚举类是特殊的class,其枚举值(RED,BLUE...)是Color的类对象(类实例):Color c=Color.RED;而且这些枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。
2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。
但是,枚举类的构造器有很大的不同:(1) 构造器只是在构造枚举值的时候被调用。
enum Color{RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);//构造枚举值,比如RED(255,0,0)private Color(int rv,int gv,int bv){this.redValue=rv;this.greenValue=gv;this.blueValue=bv;}public String toString(){ //自定义的public方法return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";}private int redValue; //自定义数据域,private为了封装。
JAVA基础知识重难点

JAVA基础知识重难点声明:以下内容为个⼈期末对JAVA基础知识的总结,来源于各种资料搜索和个⼈理解整理⽽出,也许有不妥的地⽅,欢迎学习指教1.Java语⾔具有可移植性、可跨平台运⾏特点的原因是什么?Java——编译器——jvm——平台Java⽤编译器编译成.class的字节码⽂件,字节码类似于机器指令,同⼀字节码可以在任何带jvm虚拟机的平台运⾏,从⽽实现java的跨平台性。
所谓语⾔的跨平台性并不是说是源⽂件的跨平台性(如果要这么定义那么任何的语⾔都是跨平台性的),⽽是指源⽂件编译⽣成的⽂件的跨平台性。
因为Java字节码是结构中⽴的,所以Java 的程序是可移植的。
他们可以不经过重新编译⽽在任何⼀个机器上运⾏。
2.为什么说Java语⾔具有健壮、安全的特性?Java 编译器检测出许多别的语⾔只有在⾸次执⾏的时候才会指出的问题。
Java 已经清除了⼏种在其它语⾔中被发现易于出错的编程结构。
Java具有运⾏时异常处理特性,垃圾回收机制,它为健壮性提供了编程⽀持。
Java 实现了⼏种安全机制以保护你的系统遭受危险程序的破坏。
3.简述Java虚拟机(JVM)的作⽤是什么?JVM就是Java虚拟机,它是⼀个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。
JVM有⾃⼰完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。
JVM是java字节码执⾏的引擎,还能优化java字节码,使之转化成效率更⾼的机器指令。
Java程序的跨平台特性主要就是因为JVM 实现的。
在编译java程序时会将写好的源程序通过编译器编译⽣成.class⽂件(⼜称为字节码⽂件),不同的平台对应着不同的JVM,之后就是通过JVM内部的解释器将字节码⽂件解释成为具体平台上的机器指令执⾏,所以就可以实现java程序的跨平台特性。
4.简述JVM的垃圾回收机制。
确保被引⽤对象的内存不被错误的回收。
当⼀个对象不再有任何⼀个引⽤变量指向它时,这个对象就被应⽤抛弃。
Java程序设计基础-反射、异常及枚举

本案例中调用了两个方法。首先,因为Java类会在类 中没有声明构造方法的时候自动为类创建一个无参的构造 函数,所以,首先使用newInstance()方法创建一个该类 型的对象;其次,因为本次调用了两个方法,所以使用 Class的getMethod()方法分别获取了setName()方法和 getName()方法;最后,调用setName()方法,给类的 name成员属性赋值为“MyName”,然后使用getName()方 法获取该值。
Java的反射本质就是在程序的运行过程中,动态地 创建对象并调用其方法或者修改其属性等,只要了解其 最基本的使用方式,就可以根据需求和规则进行更加丰 富的反射应用。
9.2 异常
Java的自动垃圾回收机制解放了程序员,让程序员 不再为莫名奇妙的内存溢出而焦头烂额。Java的异常机 制则极大地方便了程序员对错误的处理,异常信息可以 指向错误的来源处,让程序员可以快速地定位错误的位 置并缩小异常代码范围,大大提升了程序员的开发效率。
Java的反射被大量地应用于JavaBeans中。利用反 射,Java可以支持RAD工具,特别是在设计或运行中添 加新类时,快速地应用开发工具,能够动态地查询新添 加类的功能。这一特性在一般的程序设计语言中很少使 用,但在架构和基础组件设计中不可或缺。
在熟悉Java中的反射之前,读者需要了解面向对象 编程中的一个重要概念——运行时类型识别,也就是 RTTI(Run-Time Type Identification)。运行时类 型识别是所有面向对象都必须提供的功能。
检查型异常是指除了运行时异常外的所有异常,对 于这类异常编译器会强制用户处理,否则会导致编译不 通过。这些异常一般都需要进行捕获或者强制声明抛出; 自定义异常是指开发者为了满足系统的需求,根据系统 特性自定义的一系列异常。这些异常必须是Throwable 的直接或者间接子类,一般情况下,自定义异常会继承 Exception类。
01-java基础加强

一、eclipse工具的使用eclipse是一个开源的IDE,进行javaEE开发一般使用myeclipse插件比较方便1. java代码的位置1) 选择工作空间 workspace选择一个文件夹存放程序(代码) 不要用中文和空格2) 新建一个java 工程(Project)3) 建包(Package) 建类(Class)在 new 菜单下可以选择新建工程、包、类、接口等2. 快捷键alt + / :代码自动补齐,需要配置的打开preferences(首选项), 搜keys,打开快捷键配置面板搜 alt+/ ,取消绑定搜 content assist ,取消原先的绑定,配置成alt+/ctrl+1: 错误自动修复,注意,放行的红叉是可修复的,圆形的是不可修复的导包的三种方式:1)将类名敲完整,按下alt+/ 进行补齐,会自动导包2) ctrl+1,修正错误3) ctrl+shift+o 整理包,导入需要的包,去掉多余的导包语句ctrl+shift+f : 代码格式化管理透视图:在 window 菜单下可以对透视图进行管理ctrl+2,L 自动声明变量先按下ctrl+2 再按下 Lshift+enter 光标直接进入下一行ctrl+alt+方向键(向上向下) 复制行alt+ 方向键(向上向下) 移动当前行3. 断点调试1) 可以对程序进行调试在行的开头双击左键打断点,用debug方式来运行程序,程序就会停留在断点位置F5 跳入(step into) 跳入方法内部 F6 跳过,让当前行运行 F7跳出返回上一层程序resume 直接运行到下一个断点2) 查看源代码建议使用断点调试的方式,注意当前运行环境需要包含源码4. junit单元测试1) 写一个java类,作为测试类声明测试方法,修饰符为 public static void ,在方法前面加注解,(@Test) 就可以讲方法教给junit来运行2) 需要在测试方法前做初始化工作写一个方法 public void init()在方法前加注解 @Before3) 需要在测试后释放资源写一个方法在方法前加注解 @After4) 断言用于对测试的结果下断言,将实际结果和预期结果进行比较org.junit.Assert 用于在测试用例中下断言,如果断言失败,程序将不会继续执行二、jdk5新特性java 1995 诞生,版本: jdk1.0—jdk1.1 – jdk1.2 – jdk1.3 –jdk1.4 – 2005老虎版 jdk5.0 – jdk6 -- jdk7三个平台: javase javaee1. 静态导入2. 基本数据类型的包装类在 java 中,所有的事物都被看做对象,包括一个数字int --> Integerbyte --> Byteshort --> Shortlong --> Longchar --> Characterdouble --> Doublefloat --> Floatboolean--> Boolean1) Integer x = 1(装箱); x = x + 1; 经历了什么过程?装箱→拆箱→装箱2) 为了优化,虚拟机为包装类提供了缓冲池, Integer池的大小 -128~127 一个字节的大小/**********************************初始化了一个缓冲池private static class IntegerCache {private IntegerCache(){}static final Integer cache[] = new Integer[-(-128) + 127 + 1];static {for(int i = 0; i < cache.length; i++)cache[i] = new Integer(i - 128);}}*******************************//**************************************** IntegerCache类的 valueOf()方法public static Integer valueOf(int i) {final int offset = 128;if (i >= -128 && i <= 127) { // must cachereturn IntegerCache.cache[i + offset];}return new Integer(i);}***************************************/3. 增强for循环1) 作用:对存储对象的容器进行迭代2) jdk5以前怎么迭代3) 增强for循环迭代数组4) 单列集合 Collection5) 双列集合 Map6)集合迭代注意问题7) 增强for循环注意问题4. 可变参数5. 枚举问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个解决办法:1)在setGrade方法中做判断,不符合格式要求就抛出异常2)直接限定用户的选择,通过自定义类模拟枚举的方式来限定用户的输入写一个Grade类,私有构造函数,对外提供5个静态的常量表示类的实例3)jdk5中新定义了枚举类型,专门用于解决此类问题练习:请编写一个关于星期几的枚举WeekDay,要求:•枚举值:Mon,Tue,Wed,Thu,Fri,Sat,Sun 星期一。
java教程_反射

Method [ ] getDeclaredMethods()
getPackage()
Constructor、Field 、Method是ng.reflect包中的类, 它们的对象分别代表构造方法、成员变量、方法,包含着 对应的构造方法、成员变量、方法的信息。 ng.Package类的对象代表一个包,包含相关包的信 息。
Class类的方法 2-2
public int getModifiers()
获取各自表示的类、成员变量、方法、构造方 法对应修饰符
public native boolean isInstance(Object obj)
类似于instanceof
精确判断类型
instanceof进行的是类型兼容的判断,子类 对象可以看做是父类类型。 使用反射进行的类型判断是精确类型的, 如果精确类型不匹配,则不能通过。
Java反射(Reflection)
反射(Reflection) 2-1
反射是Java开发语言的特征之一,它允许运行中的Java程 序对自身进行检查(即内省),并能直接操作程序的内部属 性和方法。也就是说,利用反射可以在程序运行时对其进 行动态的控制。 在程序运行状态中,对于任意一个类都能够知道这个类的 所有属性和方法,对于任意一个对象都能够调用它的任意 一个方法,这种动态获取的信息以及动态调用对象的方法 的功能称为Java语言的反射机制。 在JDK中,主要由以下类来实现Java的反射机制,这些类 大部分位于ng.reflect包中。
获取Class对象有三种方法:
Class c=Class.forName(“包名+类名”); Class c = int.class; 或者Class c = Integer.TYPE; Test t=new Test();Class c=t.getClass();
java枚举算法

java枚举算法
Java枚举是一种特殊的数据类型,它包含一组固定的常量值,通常用于定义一些固定的状态或类型。
在Java中,枚举可以通过switch语句、for-each循环等方式进行遍历和操作。
Java枚举算法是指在枚举类型的基础上使用算法实现某种功能或解决某个问题的方法。
比如,在一个游戏中,可以使用枚举类型定义一些游戏角色,然后使用枚举算法实现不同角色之间的相互作用和协作。
常见的Java枚举算法包括:
1. 遍历枚举:通过for-each循环遍历枚举中的所有常量值,进行相应的操作。
2. 枚举比较:可以使用equals()方法比较枚举常量是否相等。
3. 枚举排序:可以通过Comparator接口实现对枚举常量的排序。
4. 枚举映射:可以使用Map集合将枚举常量映射到对应的值。
5. 枚举序列化:可以通过实现Serializable接口实现枚举类型的序列化,以便在不同的应用中传递和保存数据。
总之,Java枚举算法在实际开发中有着广泛的应用,可以帮助程序员更加方便和高效地处理各种问题。
- 1 -。