Java - 基础增强 - 增强for - 可变参数 - 枚举 - 反射 - 内省 - 泛型

增强for:注意:只适合取数据

// 使用增强for遍历Map集合
	@Test
	public void test1() {
		
		LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();
		
		map.put("张三", 20);
		map.put("李四", 21);
		map.put("王五", 22);
		map.put("赵六", 23);
		
		for (Map.Entry<String, Integer> me : map.entrySet()) {
			System.out.println(me.getKey() + me.getValue());
		}
	}

	// 使用传统for遍历Map集合
	@Test
	public void test2() {

		LinkedHashMap<String, Integer> map = new LinkedHashMap<String, Integer>();

		map.put("张三", 20);
		map.put("李四", 21);
		map.put("王五", 22);
		map.put("赵六", 23);

		Set<String> keySet = map.keySet();

		for (Iterator<String> it = keySet.iterator(); it.hasNext();) {
			String key = it.next();
			int value = map.get(key);
			System.out.println(key + value);
		}
	}

可变参数:注意:可变参数必须位于最后一项。

public class Demo1 {
	/*
	 * 可变参数:适用于参数个数不确定,java把可变参数当做数组处理。
	 * 
	 * 注意:如果出现可变参数的重载的情况,则编译器会自动调用最合适的方法匹配。
	 * 
	 * 但是:
	 * public class Demo2 {
	       static void f(float i,Character...args){
	              System.out.println("first");
	       }
 
	       static void f(Character...args){
	              System.out.println("second");
	       }
      
	       public static void main(String[] args){
	              f(1,'a');
	              f('a','b');//Error无法确定调用哪个方法
	       }
		}
	 * 
	 */
	public static void main(String[] args) {
		int[] i = { 1, 2, 3 };
		String[] s = { "a", "b", "c" };

		show(i);	 // 编译器会自动的把参数转变为数组的 show(new Object[]{i})
		show(s); 	//  当使用数组作为参数(类型兼容),那么编译器就不会帮你转化为数组了
		show(s, i);//   show(new Object[]{s,i})
	}

	/***********
	 * jdk5以后
	 ***********/
	private static void show(Object... obj) {
		System.out.println("数组长度:" + obj.length);
	}

	/***********
	 * jdk5以前
	 ***********/
	private static void show2(Object[] obj) {
		System.out.println(obj.length);
	}
}

输出结果:

数组长度:1
数组长度:3
数组长度:2

枚举(enumeration)类:单例、多例、用于限定范围、是一个特殊类、继承Enum、每一个枚举值代表一个实例对象

public class EnumTest {
	/*
	 * 编写一个星期几的枚举WeekDay, 
	 * 要求:枚举值MON,TUE,WED,THU,FRI,SAT,SUN 
	 * 调用方法返回中文格式的星期。
	 */
	public static void main(String[] args) {
		printDay(WeekDay.WED);
	}

	private static void printDay(WeekDay day) {
		System.out.println(day.getEnday() + ":" + day.getCnday());
	}
}

enum WeekDay {
	/*
	 * 枚举是用来限定范围,枚举值就是它的具体取值范围
	 * 当有多个枚举值的时候,可以通过构造函数的重载,来表示不同的对象。
	 * 在这里枚举只是用来封装星期信息,每一个枚举值代表一个星期对象。
	 * 每一个星期对象应该有一个英文的星期成员,和一个把英文星期转换成中文的方法。
	 */
	MON("Monday") {
		public String getCnday() {
			return "星期一";
		}
	},
	TUE("Tuesday") {
		public String getCnday() {
			return "星期二";
		}
	},
	WED("Wednesday") {
		public String getCnday() {
			return "星期三";
		}
	},
	THU("Thursday") {
		public String getCnday() {
			return "星期四";
		}
	},
	FRI("Friday") {
		public String getCnday() {
			return "星期五";
		}
	},
	SAT("Saturday") {
		public String getCnday() {
			return "星期六";
		}
	},
	SUN("Sunday") {
		public String getCnday() {
			return "星期天";
		}
	};

	private String enday;

	public String getEnday() {
		return enday;
	}	

	WeekDay(String day) {
		enday = day;
	}
	public abstract String getCnday();
}

反射:1.加载类字节码Class  2.解剖出类的个个组成部分  3.使用........主要用于框架...

public class Reflex {

	// 反射无参数的构造函数
	@Test
	public void test1() throws Exception {

		Class clazz = Class.forName("cn.itcast.demo.Person");
		Constructor c = clazz.getConstructor(null);
		Person p = (Person) c.newInstance(null);
	}

	// 反射有参数的构造函数
	@Test
	public void test2() throws Exception {

		Class clazz = Class.forName("cn.itcast.demo.Person");
		Constructor c = clazz.getConstructor(String.class);
		Person p = (Person) c.newInstance("张三");
	}

	// 反射主函数
	@Test
	public void test3() throws Exception {

		Class clazz = Class.forName("cn.itcast.demo.Person");
		Method m = clazz.getMethod("main", String[].class);
		/*
		 * 主函数的参数是一个字符串数组...
		 * invoke(Object obj, Object... args)方法...
		 * 接收的参数是一个可变参数列表。如果直接传递一个字符串对象数组,编译器不会帮你把数组封装到Object数组中
		 * 那么invoke()方法内部在遍历这个数组获取参数的时候,遍历到的结果是空
		 * 所以只能把他提升为Object对象,这样它才会被编译器当成一个元素封装到Object数组中
		 * 
		 */
		m.invoke(null, (Object) new String[] {});
	}

	// 反射私有方法
	@Test
	public void test4() throws Exception {

		Class clazz = Class.forName("cn.itcast.demo.Person");
		Method m = clazz.getDeclaredMethod("getName", null);
		// 修改访问权限,强制访问、、、
		m.setAccessible(true);
		String str = (String) m.invoke(clazz.newInstance(), null);
		System.out.println(str);
	}
	
	// 反射字段
	@Test
	public void test5() throws Exception {

		Class clazz = Class.forName("cn.itcast.demo.Person");
		Person p = (Person) clazz.newInstance();
		Field numField = clazz.getDeclaredField("num");
		// 修改访问权限,强制访问、、、
		numField.setAccessible(true);
		int num = numField.getInt(p);
		System.out.println(num);

		Field numsField = clazz.getDeclaredField("nums");
		Integer[] nums = (Integer[]) numsField.get(p);
		System.out.println(nums);
	}
}


内省:通过反射机制获取 setter和 getter

1.使用SUN的 java.beans:

public class JavaBeanTest {
	@Test
	public void test1() throws Exception {

		BeanInfo bi = Introspector.getBeanInfo(cn.itcast.bean.User.class);
		PropertyDescriptor[] pds = bi.getPropertyDescriptors();
		for (PropertyDescriptor pd : pds) {
			System.out.println(pd.getName());
		}
	}

	@Test
	public void test2() throws Exception {
		
		Class clazz = Class.forName("cn.itcast.bean.User");
		User u = (User) clazz.newInstance();
		PropertyDescriptor pd = new PropertyDescriptor("name", cn.itcast.bean.User.class);
		
		
		Method setMethod = pd.getWriteMethod();
		setMethod.invoke(u, "张三");
		
		Method getMethod = pd.getReadMethod();
		String name = (String) getMethod.invoke(u, null);
		System.out.println(name);
	}
}

2.使用beanutils:

public class BeanUtilTest {

	// 使用 BeanUtils
	@Test
	public void test1() throws Exception {

		User u = (User) Class.forName("cn.itcast.bean.User").newInstance();

		BeanUtils.setProperty(u, "name", "张三");

		String name = BeanUtils.getProperty(u, "name");

		System.out.println(name);
	}

	// 自定义日期转换器 ConvertUtils
	@Test
	public void test2() throws Exception {

		String name = "张三";
		String birthday = "1949-10-1";
		
		ConvertUtils.register(new Converter() {

			public <T> T convert(Class<T> type, Object value) {

				if (value == null)
					return null;
				if (!(value instanceof String))
					throw new ConversionException("不能转换");

				String str = (String) value;

				if (str.equals(""))
					return null;

				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
				try {
					return  (T) df.parse(str);
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}
		}, Date.class);

		User u = new User();
		BeanUtils.setProperty(u, "name", name);
		BeanUtils.setProperty(u, "birthday", birthday);

		System.out.println(BeanUtils.getProperty(u, "birthday"));
		System.out.println(BeanUtils.getProperty(u, "name"));
	}
}

泛型(generic):注意:如果两边都使用泛型,两边必须都一样、、、类型参数变量、、、实际类型参数、、、

public class GenericTest {
	/*
	 * 编写一个泛型方法,接收任意数组,并颠倒顺序
	 */
	public static void main(String[] args) {

		Integer[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		changeArr(arr);
		for (int val : arr) {
			System.out.println(val);
		}
	}

	public static <T> void changeArr(T[] arr) {

		int len = arr.length;

		if (len == 0) return;

		int centre = len / 2;
		int end = len - 1;

		for (int star = 0; star < centre; star++, end--) {

			T temp = arr[star];
			arr[star] = arr[end];
			arr[end] = temp;
		}
	}
}
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值