`
wjjbfq
  • 浏览: 82159 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java基础加强+枚举+可变参数+反射+内省

阅读更多

 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);//把对象注入到属性中
}

 

分享到:
评论

相关推荐

    Java基础加强,成就java高手

    课程涵盖了多个关键知识点,包括Eclipse的使用技巧、静态导入、可变参数、增强for循环、基本数据类型的自动拆箱与装箱、枚举、反射、JavaBean内省、BeanUtils工具包、注解、泛型、类加载器、代理以及线程并发库等。...

    Java基础知识加强PPT

    总的来说,这个PPT覆盖了Java编程中的一些重要概念,包括但不限于Eclipse的高效使用、静态导入、增强for循环、可变参数、自动装箱与拆箱、枚举、反射、JavaBean、注解以及泛型等。掌握这些知识将有助于提升Java...

    JAVA反射侯捷观点

    在Java标准库源码的修改方面,由于Java的源码通常是不可变的,我们不能直接在`Class`的构造器中添加代码。如果需要调试或学习,可以通过反编译、修改、再编译的方式,或者使用Java代理(Java代理,即`java.lang....

    java基础加强ppt(张孝祥版_黎活明版)

    java基础加强ppt(张孝祥版_黎活明版)eclipse的使用技巧、静态导入、可变参数与for循环增强、基本数据类型的自动拆箱与装箱、枚举、反射、JavaBean内省、beanutils工具包、注解、泛型、类加载器、代理、线程并发库

    张孝祥Java基础加强ppt.ppt

    eclipse的使用技巧 静态导入 可变参数与for循环增强 基本数据类型的自动拆箱与装箱 枚举 反射 JavaBean内省 beanutils工具包 注解 泛型 类加载器 代理 线程并发库

    java基础加强

    4. 可变参数(Varargs): 从Java 5.0开始,可以定义接受不定数量参数的方法。使用`...`作为参数列表的最后一位,表示该参数可以接收零个或多个相同类型的参数。这使得创建接受任意数量参数的方法变得容易,如`...

    Java5.0学习笔记

    13. **可变参数的数组类型推断**:在Java 5.0中,如果方法参数是可变参数,编译器可以根据传入的实际参数推断出数组的类型。 14. **`compareTo()`方法的重写**:对于枚举类型,Java 5.0默认提供了按照枚举常量的...

    良葛格Java JDK 5.0学习笔记ch05

    在Java 5.0中,内省API(如java.lang.reflect包)得到了加强,使得反射操作更加方便。例如,现在可以使用Annotations API来访问和处理类、方法、字段上的注解。 十、静态导入 静态导入允许一次性导入某个类的所有...

    Java 5.0 Tiger程序高手秘笈.rar

    Java 5.0引入了可变参数,允许在方法声明中使用三个点(...)来定义一个可变长度的参数列表。这使得方法调用更加灵活,不再需要创建数组来传递多个相同类型的参数。 五、增强的for循环(Enhanced For Loop) 也称为...

    Java虚拟机1.5

    6. **可变参数(varargs)**:Java 5允许在方法签名中使用省略号(...),表示可变数量的参数,方便调用时传递任意数量的同一类型的参数。 7. **静态导入**:允许一次性导入某个类的所有静态成员,避免了多次使用...

    Java5.0 Tiger程序高手秘笈(含源码)

    6. **可变参数(varargs)**:Java 5.0引入了可变参数,允许方法接受一个可变数量的参数。这在编写函数式接口或需要灵活参数数量的场景下非常有用。 7. **内省增强**:Java 5.0改进了反射API,增加了对泛型和枚举的...

    Java-jdk1.5安装包

    Java 5.0增强了反射API,使得开发者可以通过反射访问和修改类的私有字段,调用私有方法,以及获取和设置泛型信息。 总结,Java JDK1.5在语言层面带来了许多创新,极大地提升了开发效率和代码质量。泛型、枚举、注解...

    JAVA1.5安装包

    变长参数允许在方法声明中使用一个可变数量的参数。它们用三个点(...)表示,使编写接受任意数量相同类型参数的方法变得简单。 5. **增强的for循环(Enhanced For Loop)** 也称为foreach循环,增强了遍历数组和...

    良葛格Java JDK 5.0学习笔记.rar

    JDK 5.0是Java历史上的一个重要版本,引入了许多新的特性和改进,包括自动装箱/拆箱、枚举类型、可变参数、增强的for循环等。 2. **自动装箱/拆箱**:在JDK 5.0中,Java引入了自动装箱和拆箱功能,使得基本类型与...

    java API 帮助文档

    4. **变量args**:在主方法中,Java 5引入了可变参数列表(varargs),通过`...`操作符,我们可以传递任意数量的同类型参数,这在处理方法调用时提供了更大的灵活性。 5. **增强的for循环(foreach)**:Java 5引入...

    java jdk1.5

    开发者只需要在方法声明中使用"..."来标识,简化了处理可变参数列表的代码。 五、增强的for循环(For-Each Loop) 增强的for循环(也称为foreach循环)使得遍历数组和集合更加简洁。例如,`for (Type item : ...

    良葛格java jdk 5.0学习笔记

    这简化了调用方法时处理可变参数列表的操作,比如`System.out.println(Object... args)`。 5. **增强的for循环(For-Each Loop)** 增强的for循环,也称为foreach循环,提供了一种简洁的方式来遍历集合、数组和...

    java5在线版和离线版

    4. **变长参数**:通过`...`操作符,可以定义接受不定数量参数的方法,增强了函数的灵活性。 5. **for-each循环**:简化了遍历数组和集合的代码,减少了迭代器的使用。 6. **注解(Annotations)**:注解为元数据...

    javaAPI中文版1.5

    可变参数允许一个方法接受零个或多个相同类型的参数。它通过在参数列表的末尾添加“...”来实现,为编写灵活的方法提供了便利。 5. **增强的for循环(Enhanced for Loop)** 也称为foreach循环,可以简洁地遍历...

    良葛格java jdk 5.0学习笔记.rar

    4. **变长参数**:Java 5.0引入了可变参数(varargs),允许在方法声明中使用三个点(...)表示一个可变数量的参数列表,提高了方法调用的灵活性。 5. **增强的for循环**(foreach):也称为迭代器简化,使得遍历...

Global site tag (gtag.js) - Google Analytics