Enum
1.不能有public 的构造方法,谨防外部调用者实例化。
2.枚举值用,隔开
3.Public static final
4.每个枚举值可以覆盖toString()
5.所有的枚举都是java.lang.Enum 的子类
6.每个枚举值可以看做它所在的枚举类型的实例(不是部分与整体的关系)
7.(高级)使用枚举是实现单列模式的一种优化方式。
package com.itcast;
public class EnumHomeTest {
enum Director {
east{
public String toString(){
return "you choose the east";
}
},
south,
north,
west;
private void Director(){
}
public void test(String str){
System.out.println("测试枚举中的方法"+str);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Director[] dirs=Director.values();
//使用增强的for循环
for(Director dir:dirs){
System.out.print(dir.ordinal()+"\t");
System.out.print(dir.name()+"\t");
System.out.println(dir);
}
//调用单个枚举的值
System.out.println(Director.valueOf(Director.east.name()));
//调用枚举中的方法
Director.south.test("wangjie");
}
}
运行结果为
0 east you choose the east
1 south south
2 north north
3 west west
you choose the east
测试枚举中的方法wangjie
可变参数:
定义:参数的个数是可变的。
作用:减少重载方法的个数
注意:
1. 每个方法只能有一个可变类型,并且只能作为最后一个参数。
package com.itcast;
public class Person {
public static void eat( String name,String... strings){
{
System.out.println(strings.length);
System.out.print(name);
for(String str:strings){
System.out.print("\t"+str);
}
System.out.println();
}
}
public static void main(String[] args) {
Person.eat("suhaiming");
Person.eat("Hutao", "rice");
Person.eat("lining", "rice","wheat");
Person.eat("lining", "rice","wheat","water");
}
}
运行结果为:
0
suhaiming
1
Hutao rice
2
lining rice wheat
3
lining rice wheat water
反射:
在运行阶段,动态获取对象的属性、方法、类型的一种机制。
reflect
Class
Field--------代表类中变量
Method------代表类中的方法
package com.itcast.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
public static void getEmployeeAllFieldNames(){
Employee employee = new Employee();
//get all the fields in the Employee获得所有声明的属性,不包括父类的
Field[]fields = employee.getClass().getDeclaredFields();
for(Field field:fields){
//employee(object)-----Employee(class)-----Field[]--------field name
String fieldName = field.getName();
System.out.println("\t"+fieldName);
}
//以下代码获得所有的属性,包括父类的属性。
Class tempClass = employee.getClass();
do{
Field[]superClassFields = tempClass.getDeclaredFields();
for(Field field:superClassFields){
//employee(object)-----Employee(class)-----Field[]--------field name
String fieldName = field.getName();
System.out.println("\t"+fieldName);
}
tempClass = tempClass.getSuperclass();
}while(tempClass != null);
}
public static void getEmployeeAllMethods(){
//获得所有的方法
Method[]methods = Employee.class.getDeclaredMethods();
for(Method method:methods){
System.out.println("\t"+method.getName());
}
}
//测试获取父类的类型
public static String getClassName(Object obj){
Class clazz = obj.getClass();
return clazz.getName();
}
/**
* @param args
*/
public static void main(String[] args) {
String str = "";
System.out.println(getClassName(str));
//getEmployeeAllFieldNames();
//getEmployeeAllMethods();
}
}
内省:
Introspector--------BeanInfo--------PropertyDescriptor---------属性的名称,类型等
package com.itcast.reflect;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class IntrospectTest {
public static void getAllPropertyName(){
//Introspector ----BeanInfo-----PropertyDescriptor-------property name
try {
BeanInfo beanInfo = Introspector.getBeanInfo(Employee.class);
PropertyDescriptor[]propertyDesccriptors = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor propertyDescriptor:propertyDesccriptors){
System.out.print(propertyDescriptor.getName()+"\t");
System.out.println(propertyDescriptor.getPropertyType()+"\t");
System.out.println(propertyDescriptor.getReadMethod());
}
} catch (IntrospectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
getAllPropertyName();
}
}
运行结果:
name class java.lang.String
public java.lang.String com.itcast.reflect.Employee.getName()
salary class java.lang.Float
public java.lang.Float com.itcast.reflect.Employee.getSalary()
其中 Employee.class 为javabean 在此省略。
获得beans中的属性和setter方法,调用setter方法:
PropertyDescripter[] ps = Introspector.getBeanInfo(xx.getClass()).getPropertyDescriptors();//获得属性描述
for(PropertyDescriptor properdesc : ps){
String propertyName = propertydesc.getName();//获取属性的名称
Method setter = propertydesc.getWriterMethod();//获取属性的setter方法
//这里假设获取到一个String类型的值,而beans中的属性不是String类型的,所以就需要转换,转换需要使用commons-beanutils 包
//这里将xxxx转换为属性拥有的类型。
Object value = ConvertUtils.convert("xxxx",properdesc.getPropertyType());
setter.invoke(bean,value);//把对象注入到属性中
}
分享到:
相关推荐
课程涵盖了多个关键知识点,包括Eclipse的使用技巧、静态导入、可变参数、增强for循环、基本数据类型的自动拆箱与装箱、枚举、反射、JavaBean内省、BeanUtils工具包、注解、泛型、类加载器、代理以及线程并发库等。...
总的来说,这个PPT覆盖了Java编程中的一些重要概念,包括但不限于Eclipse的高效使用、静态导入、增强for循环、可变参数、自动装箱与拆箱、枚举、反射、JavaBean、注解以及泛型等。掌握这些知识将有助于提升Java...
在Java标准库源码的修改方面,由于Java的源码通常是不可变的,我们不能直接在`Class`的构造器中添加代码。如果需要调试或学习,可以通过反编译、修改、再编译的方式,或者使用Java代理(Java代理,即`java.lang....
java基础加强ppt(张孝祥版_黎活明版)eclipse的使用技巧、静态导入、可变参数与for循环增强、基本数据类型的自动拆箱与装箱、枚举、反射、JavaBean内省、beanutils工具包、注解、泛型、类加载器、代理、线程并发库
eclipse的使用技巧 静态导入 可变参数与for循环增强 基本数据类型的自动拆箱与装箱 枚举 反射 JavaBean内省 beanutils工具包 注解 泛型 类加载器 代理 线程并发库
4. 可变参数(Varargs): 从Java 5.0开始,可以定义接受不定数量参数的方法。使用`...`作为参数列表的最后一位,表示该参数可以接收零个或多个相同类型的参数。这使得创建接受任意数量参数的方法变得容易,如`...
13. **可变参数的数组类型推断**:在Java 5.0中,如果方法参数是可变参数,编译器可以根据传入的实际参数推断出数组的类型。 14. **`compareTo()`方法的重写**:对于枚举类型,Java 5.0默认提供了按照枚举常量的...
在Java 5.0中,内省API(如java.lang.reflect包)得到了加强,使得反射操作更加方便。例如,现在可以使用Annotations API来访问和处理类、方法、字段上的注解。 十、静态导入 静态导入允许一次性导入某个类的所有...
Java 5.0引入了可变参数,允许在方法声明中使用三个点(...)来定义一个可变长度的参数列表。这使得方法调用更加灵活,不再需要创建数组来传递多个相同类型的参数。 五、增强的for循环(Enhanced For Loop) 也称为...
6. **可变参数(varargs)**:Java 5允许在方法签名中使用省略号(...),表示可变数量的参数,方便调用时传递任意数量的同一类型的参数。 7. **静态导入**:允许一次性导入某个类的所有静态成员,避免了多次使用...
6. **可变参数(varargs)**:Java 5.0引入了可变参数,允许方法接受一个可变数量的参数。这在编写函数式接口或需要灵活参数数量的场景下非常有用。 7. **内省增强**:Java 5.0改进了反射API,增加了对泛型和枚举的...
Java 5.0增强了反射API,使得开发者可以通过反射访问和修改类的私有字段,调用私有方法,以及获取和设置泛型信息。 总结,Java JDK1.5在语言层面带来了许多创新,极大地提升了开发效率和代码质量。泛型、枚举、注解...
变长参数允许在方法声明中使用一个可变数量的参数。它们用三个点(...)表示,使编写接受任意数量相同类型参数的方法变得简单。 5. **增强的for循环(Enhanced For Loop)** 也称为foreach循环,增强了遍历数组和...
JDK 5.0是Java历史上的一个重要版本,引入了许多新的特性和改进,包括自动装箱/拆箱、枚举类型、可变参数、增强的for循环等。 2. **自动装箱/拆箱**:在JDK 5.0中,Java引入了自动装箱和拆箱功能,使得基本类型与...
4. **变量args**:在主方法中,Java 5引入了可变参数列表(varargs),通过`...`操作符,我们可以传递任意数量的同类型参数,这在处理方法调用时提供了更大的灵活性。 5. **增强的for循环(foreach)**:Java 5引入...
开发者只需要在方法声明中使用"..."来标识,简化了处理可变参数列表的代码。 五、增强的for循环(For-Each Loop) 增强的for循环(也称为foreach循环)使得遍历数组和集合更加简洁。例如,`for (Type item : ...
这简化了调用方法时处理可变参数列表的操作,比如`System.out.println(Object... args)`。 5. **增强的for循环(For-Each Loop)** 增强的for循环,也称为foreach循环,提供了一种简洁的方式来遍历集合、数组和...
4. **变长参数**:通过`...`操作符,可以定义接受不定数量参数的方法,增强了函数的灵活性。 5. **for-each循环**:简化了遍历数组和集合的代码,减少了迭代器的使用。 6. **注解(Annotations)**:注解为元数据...
可变参数允许一个方法接受零个或多个相同类型的参数。它通过在参数列表的末尾添加“...”来实现,为编写灵活的方法提供了便利。 5. **增强的for循环(Enhanced for Loop)** 也称为foreach循环,可以简洁地遍历...
4. **变长参数**:Java 5.0引入了可变参数(varargs),允许在方法声明中使用三个点(...)表示一个可变数量的参数列表,提高了方法调用的灵活性。 5. **增强的for循环**(foreach):也称为迭代器简化,使得遍历...