`
w7849516230
  • 浏览: 20327 次
文章分类
社区版块
存档分类
最新评论

java编程思想阅读笔记(七)类型信息

 
阅读更多
一个寒假或者说一个愉快的春节过去了,自然是轻松的,现在还是继续我的阅读。停了这些日子,再重新读的时候有了很多收获,书有时候是需要反复的读的;不过感觉这本书没有从一个语言的系统角度自上而下的展开,而是从理解的难易(自己觉得)由浅入深将Java中很多的细节娓娓道来;个人感觉这样对理解语言设计的本事没有太多益处,只是积累了更多的碎片,而对于实际使用,却有很大的指导意义。还是不感慨了,这里跳过了字符串一章,主要是强调StringBuilder类以及正则表达式(c#的用过一些,这个还是用到的时候看吧(例子里用了简单的),那些方法名自己也记不住,道理应该差不多)。
1.这一章主要讨论了运行时类型信息的获得与使用。
(1)Class对象
“在Java中,所有的类型转换都是在运行时进行正确性检查的。”“每个类都有一个Class对象(被保存在一个同名的.class文件中)”,因此可以通过Class类(所有Class对象都属于这个类)的一些方法来动态获得所需要的类的Class对象,如Class.forName()方法通过字符串形式的类名获得其class对象引用,进而获得该类的信息,或者可以通过newInstance()方法实现对象的构建;而这里对class对象的获得,使得该类被加载,同时static语句被执行,而单纯对类static final值(编译期常量)的引用不会引起static初始化,也可以说间接的说明了构造器隐式地是静态的。
类字面常量:另一种生成class对象引用,是 类名.class 的形式,这种方式不会自动地初始化该class对象。“Class引用总是指向某个Class对象,它可以制造类的实例,并包含可作用于这些实例的所有方法代码”,为了更充分的利用Class,可以通过泛化的Class引用,使用“?”通配符和extends、super等关键字来无限或有限制的使用class类引用。
(2)类型检查
关键字instanceof,形如 x instanceof Dog 它返回一个布尔值,检测该对象是不是某个特定类型;另一种方式是Class.isInstance()可以动态的检测对象类型。这里需要注意的是使用instanceof 或者 isInstance()方法对对象进行检测时,保持了类型的概念,即检查的是“是这个类或者是这个类的派生类”,而通过使用“==”与获取的class对象引用对比则只是进行确切类型的比较。
反射
没有找到比较好的概念文字,但是这样理解还是可以的,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。这里有会产生两个问题:一是运行中动态的获得类型信息,RTTI也是可以做到的,但是这个是在编译时打开和检查.class文件的,而反射机制是在运行时获得类型信息(这个还是有些不明白,mark);另一个问题是既然是获得类或者对象的所有属性和方法,那么private等修饰隐藏的私有信息也是可以获得的了,这里需要有一个前提就是知道这个类的方法或者属性名(仍然是可以通过java反编译工具获得的,因此确实是可以的,但是并不建议如此)。

Class类和java.lang.reflect类库一起支持反射机制,包括了Field、Method、Constructor类。可以看一个书上的例子(我增加了属性获取):

package com.test.myjava;
 /*
  * @author w7849516230
  */
import java.lang.reflect.*;
import java.util.regex.*;

/* 功能:可以查询任意类的所有public权限的方法、属性(可以查看所有),
 * 当有第二个参数时,可以作为包含指定字符串的方法或属性过滤
 * 注意:在eclipse中使用时,需要包含完整的包名;如果在console执行,需要注意包名
 */
public class ShowClassInformation {
	private static String usage = 
		"usage:\n" +
		"ShowMethods qualified.class.name\n" +
		"To Show all methods in class or:\n" +
		"ShowMethods qualified.class.name word\n" +
		"To Search for methods involving 'word'";
	public String str = "public string";
	private static Pattern p = Pattern.compile("\\w+\\.");
	//表示过滤掉前面的命名修饰,如果用下面的可以看到完整的命名
	//private static Pattern p = Pattern.compile("\\W+\\.");
	
	public static void main(String[] args){
		if(args.length < 1){
			System.out.print(usage);
			System.exit(0);
		}
		int lines = 0;
		try{
			Class<?> c = Class.forName(args[0]);
			//使用下面的类字面常量则不用try catch语句
			//Class<?> c = ShowClassInformation.class
			Method[] methods = c.getMethods();
			Constructor[] ctors = c.getConstructors();
			Field[] fields = c.getFields();
			
			/* 如果需要设置属性值使用setXXX方法
			 * 调用方法可以使用Invoke方法
			 */
			if(args.length == 1){
				System.out.println(args[0]+" Methods:");
				for(Method method : methods)
					System.out.println(p.matcher(method.toString()).replaceAll(""));
				System.out.println();
				
				System.out.println(args[0]+" Constructors:");
				for(Constructor ctor : ctors)
					System.out.println(p.matcher(ctor.toString()).replaceAll(""));
				System.out.println();
				
				System.out.println(args[0]+" Fields:");
				for(Field field : fields)
					System.out.println(p.matcher(field.toString()).replaceAll(""));
				System.out.println();
				
				lines = methods.length + ctors.length + fields.length;
			}else {
				for(Method method : methods)
					if(method.toString().indexOf(args[1]) != -1){
						System.out.println(p.matcher(method.toString()).replaceAll(""));
						lines++;
					}
				for(Constructor ctor : ctors)
					if(ctor.toString().indexOf(args[1]) != -1){
						System.out.println(p.matcher(ctor.toString()).replaceAll(""));
						lines++;
					}
				for(Field field : fields)
					if(field.toString().indexOf(args[1]) != -1){
						System.out.println(p.matcher(field.toString()).replaceAll(""));
					}
			}
			}catch(ClassNotFoundException e){
				System.out.println("No such class:" + e);
		}
	}
}
输入参数为:java.lang.reflect.Method
输出为:java.lang.reflect.Method Methods:
public int hashCode()
public int getModifiers()
public transient Object invoke(Object,Object[]) throws IllegalAccessException,IllegalArgumentException,InvocationTargetException
public boolean equals(Object)
public String getName()
public String toString()
public Annotation getAnnotation(Class)
public Annotation[] getDeclaredAnnotations()
public Class getDeclaringClass()
public Class[] getParameterTypes()
public Class getReturnType()
public TypeVariable[] getTypeParameters()
public boolean isSynthetic()
public String toGenericString()
public Object getDefaultValue()
public Class[] getExceptionTypes()
public Type[] getGenericExceptionTypes()
public Type[] getGenericParameterTypes()
public Type getGenericReturnType()
public Annotation[][] getParameterAnnotations()
public boolean isBridge()
public boolean isVarArgs()
public Annotation[] getAnnotations()
public boolean isAnnotationPresent(Class)
public boolean isAccessible()
public static void setAccessible(AccessibleObject[],boolean) throws SecurityException
public void setAccessible(boolean) throws SecurityException
public final native Class getClass()
public final void wait() throws InterruptedException
public final void wait(long,int) throws InterruptedException
public final native void wait(long) throws InterruptedException
public final native void notify()
public final native void notifyAll()


java.lang.reflect.Method Constructors:


java.lang.reflect.Method Fields:
public static final int PUBLIC
public static final int DECLARED
反射机制又为动态代理创造了条件,可以在运行时,根据反射机制获得的类型信息,调用被代理对象的属性方法。用到Interface InvocationHandler和类Proxy。
分享到:
评论

相关推荐

    java编程思想读书笔记

    ### Java编程思想读书笔记 #### 一、Java与C++的区别及内存管理 在学习Java的过程中,我们常常会拿它与C++进行比较。这两门语言虽然有着相似之处,但也有许多不同点。 1. **内存管理:** - C++提供了更为底层的...

    java编程思想学习笔记

    Java是一种面相对象的编程语言。计算机语言分成两种,第一种是面向机器结构的语言,构建数据模型是基于机器的结构。第二种是面向待解决问题结构的语言,构建数据模型是基于问题的结构。Java提供了更丰富的工具来描述...

    java编程思想笔记

    java编程思想笔记,建议与书本结合使用。。。。。。。。。。。

    Java编程思想读书笔记.pdf

    Java编程思想读书笔记.pdf

    Java编程思想读书笔记.doc

    ### Java编程思想读书笔记知识点梳理 #### 第1、2章:万事万物皆对象 ##### 一、所有对象都必须由你建立 - **存储位置**: - **寄存器**:程序中不可控。 - **栈 (Stack)**:存放基本类型数据和对象引用,对象...

    Java编程思想-笔记.docx

    Java编程思想笔记 本笔记涵盖了Java编程思想的多个方面,包括访问权限控制、封装、继承、多态、接口、内部类、持有对象等。 访问权限控制 访问权限控制是为了把变动的事物与保持不变的事物区分开来。Java中有四种...

    Java编程思想重点笔记(Java开发必看)

    ### Java编程思想重点知识点解析 #### 一、Java中的多态性理解 多态性是面向对象编程的一个核心特性,允许子类对象替代父类对象。在Java中,多态性的实现主要通过以下几种方式: 1. **动态绑定**:在Java中,除了...

    Java编程思想读书笔记

    《Java编程思想读书笔记》 Java是一门面向对象的编程语言,它的核心理念是“万事万物皆对象”。在Java中,所有的对象都是通过类(Class)来定义的,并且必须由程序员显式创建。理解对象的存储位置是理解Java内存...

    Java编程思想笔记

    ### Java编程思想笔记 #### 重要知识点概览 在深入探讨《Java编程思想笔记》时,我们可以提炼出一系列核心概念和技巧,它们是理解和掌握Java编程语言的关键。本笔记覆盖了从基本的数据类型、对象创建到高级的多态...

    Java编程思想学习笔记

    在讨论Java编程思想学习笔记时,首先需要了解的是Java语言的平台无关性,而这一特性正是通过Java虚拟机(JVM)得以实现的。JVM作为Java程序设计的关键组成部分,对于Java开发人员来说是必须掌握的基础知识。在该学习...

    Java编程思想重点笔记(Java开发必看)

    Java 编程思想是每一位Java开发者都需要深入了解的重要领域。这篇笔记涵盖了多个关键知识点,包括多态性、final方法、静态方法、构造函数以及构造过程中的多态行为。 首先,Java中的多态性是面向对象编程的核心特性...

    读书笔记:JAVA编程思想阅读.zip

    读书笔记:JAVA编程思想阅读

    Java编程思想读书笔记.rar

    2. stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中 3. Heap:存放用new产生的数据 4. Static storage:存放在对象中用static定义的静态成员 5. Constant storage:...

    Java编程思想第四版_读书笔记推荐.pdf

    Java 编程思想第四版读书笔记推荐.pdf 以下是从给定的文件信息中生成的相关知识点: 1. 面向对象程序设计(Object-oriented Programming OOP) * UML(Unified Modeling Language 统一建模语言) * 将对象想像成...

    java编程思想读书笔记.rar

    《Java编程思想》是 Bruce Eckel 的经典之作,这本书深入浅出地介绍了Java语言...通过阅读《Java编程思想》,读者可以全面理解Java语言,并具备实际开发能力。配合书中的例子和练习,能更好地巩固知识,提升编程技能。

    JAVA编程思想笔记.pdf

    JAVA编程思想笔记.pdf

Global site tag (gtag.js) - Google Analytics