`
joyocaowei
  • 浏览: 32650 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JAVA反射基础

 
阅读更多

能够分析类能力的程序被称为反射(reflective)。


反射是一种功能强大且复杂的机制,使用它的主要对象是工具构造者。如果你编写的程序必须要与编译时未知的类一起工作,如有可能,就应该仅仅使用反射机制来实例化对象,而访问对象时则使用编译时已知的某个接口或者超类。比如你要实例化类java.util.TreeSet,你可以这样使用:

Set<String> s = (Set<String>) Class.forName("java.util.TreeSet")
					.newInstance();
 

先说Class类,获得Class对象三种方法,一是Class e1 = e.getClass(); 二是Class.forName("java.util.Date"), 括号中的类名是完整名(包括包名), 三是Class cl1 = Date.class; Class cl2 = int.class;

一个Class对象实际上表示的是一个类型,而这个类型未必是一种类,如它可以是一个int类型,int.class代表一个Class类型的对象。比如:

int[] ia = new int[3];
int[] ib = new int[6];
// true
System.out.println(ia.getClass() == ib.getClass());

 因为ia和ib都是int类型,所以它们返回相同的Class类型。

 

我们一般使用JDBC连接mysql数据库时,代码是这样的

 

Class.forName("com.mysql.jdbc.Driver"); // 注册驱动
Connection conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/test", "root", "pass"); // 获得连接对象
 

 那么Class.forName("")到底做了什么呢?返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于

Class.forName(className, true, currentLoader) 

其中 currentLoader 表示当前类的定义类加载器,调用 forName("X") 将导致命名为 X 的类被初始化。接着我们看看com.mysql.jdbc.Driver的代码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	// ~ Static fields/initializers
	// Register ourselves with the DriverManager
	static {
		try {
			java.sql.DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}

	/**
	 * Construct a new driver and register it with DriverManager
	 * 
	 * @throws SQLException
	 *             if a database error occurs.
	 */
	public Driver() throws SQLException {
		// Required for Class.forName().newInstance()
	}
} 

 在初始化类Driver时,静态块中的代码会被执行

java.sql.DriverManager.registerDriver(new Driver());
 

  于是Driver类被注册到DriverManager中,接着就可以建立连接。

在JDBC4.0(以mysql的驱动为例,版本至少是5.1.6以上)中不需要使用Class.forName()方法显示的加载jdbc驱动程序,若使用 Class.forName() 加载 JDBC 驱动程序的现有程序将在不作修改的情况下继续工作。具体可以参考java.sql.DriverManager的API(JDK1.6以上)

 

Class类还有一个很有用的方法newInstance(),可以用来快速的创建一个类的实例。newInstance()方法需要一个默认的构造器来初始化创建的对象。可以参考一个例子(取自effective java 2):

 

import java.util.Arrays;
import java.util.Set;

/**
 * 参数列表
 * java.util.TreeSet      
 * qwe
 * asd
 * sdf
 * asw
 * zza
 * asq 
 * aqw
 */
public class SetTest {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Class<?> cl = null;
		try {
			cl = Class.forName(args[0]);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.exit(1);
		}
		Set<String> s = null;
		try {
			s = (Set<String>) cl.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
			System.exit(1);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			System.exit(1);
		}
		s.addAll(Arrays.asList(args).subList(1, args.length));
		System.out.println(s);
	}
}
//输出: [aqw, asd, asq, asw, qwe, sdf, zxc, zza]

 

 

 

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:

Class类:代表一个类。

Field 类:代表类的成员变量(成员变量也称为类的属性)。

Method类:代表类的方法。

Constructor 类:代表类的构造器。

Array类:提供了动态创建数组,以及访问数组的元素的静态方法。


在core java卷一种介绍了反射的几种用法:

1、利用反射分析类的能力

2、在运行时使用反射分析对象

3、使用反射编写泛型数组代码


这里不贴代码了,事实上看看书也就基本了解反射的基础了,要熟悉一些常用的API运用。


假设有一个某一类型的数组已经填满,现在希望扩展它的长度,自动扩展。

Class cl = a.getClass();
      if (!cl.isArray()) return null;
      Class componentType = cl.getComponentType();
      int length = Array.getLength(a);
      // 扩展的长度(根据需要扩展)
      int newLength = length * 11 / 10 + 10;

      Object newArray = Array.newInstance(componentType, newLength);
      System.arraycopy(a, 0, newArray, 0, length);
      return newArray;
 

 

 它山之石: http://www.iteye.com/topic/1123081

 


分享到:
评论

相关推荐

    Java反射性能测试分析

    #### Java反射基础 Java反射主要依赖于以下几类API: - `java.lang.Class`: 提供了获取类信息的方法。 - `java.lang.reflect.Field`: 允许访问和修改类的字段。 - `java.lang.reflect.Method`: 用于调用类的方法。 ...

    java反射操作父类所有属性和方法

    #### 二、Java反射基础 在深入讨论如何操作父类之前,我们先简要回顾一下Java反射的基本概念: - **Class**: 每个类都有一个与之对应的`Class`对象,它是反射的基础。 - **Constructor**: 用于创建类的新实例。 - ...

    java反射笔记

    关于标签"反射基础",在Java反射基础中,还包括了泛型信息的获取、接口实现类的判断、注解的处理等内容: 1. 泛型信息:虽然Java泛型在编译后会被擦除,但通过反射仍可以获取到泛型的实际类型。 2. 接口实现:`Class...

    新手学习java反射基础

    Java 反射基础知识点 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。下面我们来一起学习一下吧。 一、...

    java反射入门

    Java反射是Java语言的一个重要特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。反射机制使得代码能够动态地获取类的信息并调用其方法,增加了程序的灵活性和可扩展性。以下将详细介绍Java反射中的几...

    Java反射基础入门,一篇就够啦

    Java反射基础入门 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。本文将详细介绍Java反射的基础知识,包括反射的基本概念、工作原理、使用方法及优缺点。...

    基于java反射的验证框架

    一、Java反射基础 Java反射机制是在运行时分析类的能力,包括获取类的信息(如类名、属性、方法等)、创建对象、调用方法、访问和修改属性。通过Class类、Constructor类、Method类和Field类,我们可以动态地获取和...

    JAVA反射教程有代码

    1. **Java反射基础** - **Class对象**:每个类在Java运行时都有一个对应的Class对象,可以通过`Class.forName()`或对象的`getClass()`方法获取。 - **构造器**:通过`Class.newInstance()`或`Constructor.new...

    java反射的简单代码例子

    1. **Java反射基础** - **Class对象**:每个类在内存中都有一个Class对象,它代表了类的信息。我们可以通过`Class.forName()`方法或者`某个类.class`来获取Class对象。 - **Constructor对象**:表示类的构造器,...

    java反射,获取所有属性、方法以及List集合类

    首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`方法或者对象的`getClass()`方法来获取`Class`对象。一旦我们有了`Class`对象,就可以进一步...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    java反射 详解 入门到掌握

    1. **Java反射基础** - **Class对象**:每个类在内存中都有一个Class对象,它代表了这个类的信息。通过`Class.forName()`方法或者对象的`getClass()`方法可以获取到Class对象。 - **构造器与对象创建**:通过`...

    java反射视频

    ### Java反射基础 1. **Class类与反射**:在Java中,所有类都继承自`java.lang.Class`类。通过`Class`对象可以获取类的各种信息并进行操作。例如,可以通过类名或对象获取`Class`实例,进而调用其方法获取类名、...

    java反射源代码

    一、Java反射的基础概念 Java反射源于Java.lang.Class类,它代表了Java运行时的类信息。通过Class对象,我们可以获取到类的构造器、方法、字段等信息,甚至可以动态地实例化对象和调用其成员。例如,`Class&lt;?&gt; ...

    java反射机制基础

    java反射机制基础,是进入java反射机制的一把钥匙

    JAVA反射详细讲解

    一、反射基础 1. 类与对象的元数据:在Java中,每个类都由Class对象表示,这个对象包含了关于类的所有信息,如类名、构造器、方法、字段等。通过Class类,我们可以获取到运行时的类信息。 2. 获取Class对象:有三...

    java反射原理

    #### 一、Java反射基础 ##### 1.1 Java虚拟机方法区 Java虚拟机(JVM)中包含了多种运行时数据区,包括方法区、堆区和栈区等。其中,**方法区**是用于存储已被加载的类信息的重要区域。当JVM加载某个类时,类加载...

    java反射机制文档及代码

    在本资料"java反射机制文档及代码"中,详细介绍了Java反射的基础知识和常见应用。 首先,反射的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们可以获取到类的名称、包名、属性、构造器、...

    Java反射机制 Java反射机制

    随着面向对象编程的发展,动态类型和动态绑定的概念逐渐成熟,这为Java反射机制的出现奠定了基础。Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射...

    实战java反射机制-让你迅速认识java强大的反射机制

    1. 反射基础: Java反射机制主要基于`java.lang.Class`类和`java.lang.reflect`包中的接口和类。`Class`对象代表了运行时的类信息,通过`Class.forName()`方法可以获取到类的`Class`对象。此外,`java.lang.reflect...

Global site tag (gtag.js) - Google Analytics