JAvaベース補強+列挙+可変パラメータ+反射+内省

6579 ワード

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.各メソッドには可変タイプが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);//         
}