读书人

Java 枚举、反射等(系列下)

发布时间: 2012-12-18 12:43:41 作者: rapoo

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); //内存泄漏

?

→开发框架原理的理解(反射的应用)

?

?





?

读书人网 >编程

热点推荐