`

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

 

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

 

 





 

分享到:
评论

相关推荐

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    Java枚举类型Enum的用法

    总结来说,Java枚举类型提供了一种安全、类型安全的方式来定义和使用常量,它可以拥有构造器、方法和字段,并能与switch语句、序列化、反射等Java特性很好地结合。理解并熟练使用枚举,能够使代码更加清晰、易读,...

    JAVA基础-反射-枚举

    ### JAVA基础-反射-枚举知识点详解 #### 一、反射概述 反射是Java语言提供的一种能在运行时分析类和对象的能力。通过反射,我们可以在程序运行时动态地获取类的信息(如类名、方法、构造函数等)并操作这些信息。 ...

    Java期末复习——枚举与反射机制

    Java编程语言中,枚举和反射机制是两个重要的特性,它们在不同的场景下有着独特的用途。下面我们将详细探讨这两个主题。 一、枚举 枚举(Enum)在Java中用于定义一组固定数量的值,这些值可以作为常量使用。枚举...

    枚举和简单反射

    在Java编程语言中,枚举(Enum)和反射(Reflection)是两个非常重要的特性,它们在实际开发中有着广泛的应用。下面将详细讲解这两个概念及其使用技巧。 **枚举(Enum)** 枚举是一种特殊的类,它允许我们定义一组...

    java枚举类型优秀源代码

    Java 7 引入了一些新特性,如带资源的try语句、多捕获等,增强了语言的功能性和易用性。 #### Java 7 新特性 - **带资源的try语句**:简化了资源管理,自动关闭try块内的资源。 - **多捕获**:在一个catch块中捕获...

    Java工作笔记-枚举类型反射

    在实际开发中,枚举反射的应用场景可能包括但不限于动态调用枚举方法、遍历枚举常量并执行某些操作、在不明确枚举具体类型的情况下进行通用处理等。了解和掌握枚举的反射机制对于提升Java程序的灵活性和可扩展性...

    Java源码查看枚举类型定义.rar

    本资源"Java源码查看枚举类型定义.rar"包含了关于Java枚举类型的详细解释和实例,旨在帮助开发者深入理解这一特性。 首先,枚举类型在Java中通过关键字`enum`声明。例如: ```java public enum Color { RED, ...

    java 枚举(enum) 详解(学习资料)

    《Effective Java》和《Java 与模式》等书籍推荐使用枚举实现单例,因为它们提供了一种天然的防篡改机制,保证了在任何情况下都只有一个实例。 5. **枚举的优势**: - **安全性**:枚举对象是不可变的,防止了意外...

    Java反射泛型,实现数据库的动态增删改查等功能

    Java反射和泛型是两种强大的编程特性,它们在开发中有着广泛的应用,特别是在数据库操作的动态化场景下。本文将详细介绍如何结合这两种技术实现在Java中对MySQL、SQL Server或Oracle数据库进行动态的增删改查操作。 ...

    通过枚举反向给实体类赋值

    然而,在实际开发中,我们经常需要将枚举值反向映射到实体类的属性上,以便在处理表单提交的数据时进行赋值。这可以有效地减少代码的冗余,提高可读性和维护性。本文将详细探讨如何创建一个工具类来实现这个功能。 ...

    java枚举是如何保证线程安全的

    Java枚举类型自Java SE5引入以来,成为了保证线程安全的一种强大工具。在Java中,枚举是一种特殊的类,由编译器自动处理并确保其线程安全性。以下是关于Java枚举线程安全的详细解释。 首先,枚举类型在Java中实际上...

    java反射机制文档及代码

    在实际开发中,Java反射机制广泛应用于框架设计、插件系统、动态代理、序列化、测试工具等多个领域。然而,反射使用不当也可能带来性能问题和安全风险,因此需谨慎使用。 通过阅读"1139760298222java.pdf"这份文档...

    Java 8个反射实例

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java 8中,虽然没有引入重大的反射新特性,但原有的反射API仍然提供了丰富的功能,使得开发者...

    Java实验2 反射.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    候捷谈Java反射机制

    Java反射的核心在于`java.lang.Class`类,以及`java.lang.reflect`包中的`Method`、`Field`和`Constructor`等类。`Class`类非常特殊,它代表了运行时的Java类和接口,包括枚举、数组、原始Java类型和void关键字。每...

    java反射实例

    7. **注解与反射**:通过`getAnnotations()`和`isAnnotationPresent()`等方法,可以获取类、方法、字段上的注解信息,这对于实现元数据驱动的设计非常有用。 8. **动态代理(Dynamic Proxy)**:Java反射还提供了`...

    Java反射动态加载实例类

    - `java.lang.reflect.Field`:表示类或接口的字段(包括枚举常量)。 - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Constructor`:表示类的构造器。 #### 二、动态加载实例类 在给定文件...

    JAVA反射详解

    Java反射是Java编程语言的一个强大特性,允许程序在运行时检查和操作类、接口、字段和方法等。本文章旨在深入解析Java反射机制,包括其原理、应用以及常见用法。 #### 了解Class对象 在Java中,`Class`对象是一个...

    JDK5.0新特性 常量 、枚举、 for each、反射

    总结起来,JDK 5.0引入的常量注解、枚举、for each循环和反射特性,极大地丰富了Java语言的特性和表达能力,提升了开发效率和代码质量。通过理解并熟练应用这些特性,开发者可以编写出更加高效、安全和易于维护的...

Global site tag (gtag.js) - Google Analytics