Java 枚举、反射等(系列上)
?
@version 1.0 ?2011.01.10
1,引言
→基础+学习能力
→ide工具开发配置(Eclipse)
?? java、javac的jdk版本
→知识面(java ee ?IDE ?jms ?jmx ?jndi...)、jdk5/jdk6新特性
2,jdk5新特性要摘
import static 导入一个类中的某个或所有静态方法
(import 导入一个类或包中所有类)
→overload vs override
→可变参数 ...(隐藏数组)
→增加for循环 (实现Iterable接口的集合类)
for(VariableModifiers Type Identifier:Expression)statement
→自动拆装箱autoboxing/unboxing(将对象中的基本数据形态信息从对象中自动取出,隐藏细节)
?说明:http://www.talentdigger.cn/home/space-6-do-blog-id-2368.html
→享元模式(flyweight)
3,枚举 enum
?→说明和应用:http://tech.e800.com.cn/articles/2009/97/1252286198897_1.html
?→eg
?? ? ? ? ? ----------------------------------
?? ? ? ?import java.util.Date;
public class EnumTest {
public static void main(String[] args) {
?? ?WeekDay1 weekDay = WeekDay1.MON;
?? ?System.out.println(weekDay.nextDay());
?? ?WeekDay weekDay2 = WeekDay.FRI;
?? ?System.out.println(weekDay2);
?? ?System.out.println(weekDay2.name());
?? ?System.out.println(weekDay2.ordinal());
?? ?System.out.println(WeekDay.valueOf("SUN").toString());
?? ?System.out.println(WeekDay.values().length);
}
public enum WeekDay{
?? ?SUN(1),MON(),TUE,WED,THI,FRI,SAT;
?? ?private WeekDay(){System.out.println("first");} //带有构造函数
?? ?private WeekDay(int day){System.out.println("second");}
}
public enum TrafficLamp{
?? ?RED(30){? //带有抽象方法
????? ??public ?TrafficLamp nextLamp(){
?? ??? ??? ?return GREEN;
?? ??? ?}
?? ?},
?? ?GREEN(45){
?? ??? ?public ?TrafficLamp nextLamp(){
?? ??? ??? ?return YELLOW;
?? ??? ?}
?? ?},
?? ?YELLOW(5){
?? ??? ?public ?TrafficLamp nextLamp(){
?? ??? ??? ?return RED;
?? ??? ?}
?? ?};
?? ?public abstract TrafficLamp nextLamp();
?? ?private int time;
?? ?private TrafficLamp(int time){this.time = time;}
?? ?}
}
→单成员枚举可以作为单例实现方式
5,反射★
→Class类 ?描述Java程序中的Java类,代表Java类在内存中的字节码
类.class\对象.getClass()\Class.forname("类名")
→数组类型实例对象 ?Class.isAarry
→反射 把Java中的各种成分映射成相应的Java类
Field、Method、Constructor、Package等
→构造方法反射Constructor
//new String(new StringBuffer("abc")); //需求:反射生成字符串abc
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String)constructor.newInstance(/*"abc"*/new StringBuffer("abc"));
System.out.println(str.charAt(2));
→成员变量反射Field
//需求:反射获得成员变量的值
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值
System.out.println(fieldY.get(pt1));
Field fieldX = pt1.getClass().getDeclaredField("x"); //私有
fieldX.setAccessible(true); //暴力反射
System.out.println(fieldX.get(pt1));
→成员方法反射Method
//TestArguments.main(new String[]{"111","222","333"});//需求:反射调用循环显示数组内容成员方法
String startingClassName = args[0];
Method mainMethod = Class.forName(startingClassName).getMethod("main", String[].class);
//mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
?
→面向对象的专家模式
→数组反射以及数组与Object的关系
?? ? ? ? ? ----------------------------------
int [] a1 = new int[]{1,2,3};
int [] a2 = new int[4];
int[][] a3 = new int[2][3];
String [] a4 = new String[]{"a","b","c"};
System.out.println(a1.getClass() == a2.getClass());
System.out.println(a1.getClass() == a4.getClass()); //*
System.out.println(a1.getClass() == a3.getClass()); //*
System.out.println(a1.getClass().getName());
System.out.println(a1.getClass().getSuperclass().getName());
System.out.println(a4.getClass().getSuperclass().getName());
Object aObj1 = a1;
Object aObj2 = a4;
//Object[] aObj3 = a1;
Object[] aObj4 = a3;
Object[] aObj5 = a4;
?
System.out.println(a1);
System.out.println(a4);
System.out.println(Arrays.asList(a1));
System.out.println(Arrays.asList(a4));
//打印传入内容
printObject(a4);
printObject("xyz");
private static void printObject(Object obj) {
?? ?Class clazz = obj.getClass();
?? ?if(clazz.isArray()){
?? ??? ?int len = Array.getLength(obj);
?? ??? ?for(int i=0;i<len;i++){
?? ??? ??? ?System.out.println(Array.get(obj, i));
?? ??? ?}
?? ?}else{
?? ??? ?System.out.println(obj);
?? ?}
}
?? ? ? ? ? ----------------------------------
→ArrayList vs HashSet、HashCode分析(哈希算法)
?
→eg HashSet机制和内存泄漏
Collection collections = new HashSet();
ReflectPoint pt1 = new ReflectPoint(3,3);
ReflectPoint pt2 = new ReflectPoint(5,5);
ReflectPoint pt3 = new ReflectPoint(3,3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
pt1.y = 7;
collections.remove(pt1); //内存泄漏
?
→开发框架原理的理解(反射的应用)
?
?
?