`

反射 - Class类

阅读更多
反射(reflective)是指能够分析类的能力。

利用反射,我们可以在运行时分析类,查看对象。

在Java中类的运行时信息保存在Class类中。

那么,如何获得一个Class类的对象呢?

基本方法有三种:

1) 通过对象的getClass(类全名)方法
eg:
Employee e;
Class c = e.getClass();


2) 通过Class类自己的静态方法forName
eg:
String className = "java.util.Date";
Class c = Class.forName(className);


3) 通过"类名.class"来获取Class对象
eg:
Class c1 = Date.class;
Class c2 = int.class;
Class c3 = Double[].class;


反射最基本的一个应用就是:我们可以在运行时创建类的实例。

可以利用Class类的newInstance()方法创建类的实例。

例如:
e.getClass().newInstance();

Class.forName("java.util.Date").newInstance();


下面的例子是通过输入一个类名来打印出类的构造函数,方法和属性。

package coretrain.reflection;

import java.util.*;
import java.lang.reflect.*;

public class ReflectionTest {
	public static void main(String[] args) {
		// read class name from command line args or user input
		String name;
		if (args.length > 0)
			name = args[0];
		else {
			Scanner in = new Scanner(System.in);
			System.out.println("Enter class name (e.g. java.util.Date): ");
			name = in.next();
		}

		try {
			// print class name and superclass name (if != Object)
			Class cl = Class.forName(name);
			Class supercl = cl.getSuperclass();
			System.out.print("class " + name);
			if (supercl != null && supercl != Object.class)
				System.out.print(" extends " + supercl.getName());

			System.out.print("\n{\n");
			printConstructors(cl);
			System.out.println();
			printMethods(cl);
			System.out.println();
			printFields(cl);
			System.out.println("}");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.exit(0);
	}

	/**
	 * Prints all constructors of a class
	 */
	public static void printConstructors(Class cl) {
		Constructor[] constructors = cl.getDeclaredConstructors();

		for (Constructor c : constructors) {
			String name = c.getName();
			System.out.print("   " + Modifier.toString(c.getModifiers()));
			System.out.print(" " + name + "(");

			// print parameter types
			Class[] paramTypes = c.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++) {
				if (j > 0)
					System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}

	/**
	 * Prints all methods of a class
	 */
	public static void printMethods(Class cl) {
		Method[] methods = cl.getDeclaredMethods();

		for (Method m : methods) {
			Class retType = m.getReturnType();
			String name = m.getName();

			// print modifiers, return type and method name
			System.out.print("   " + Modifier.toString(m.getModifiers()));
			System.out.print(" " + retType.getName() + " " + name + "(");

			// print parameter types
			Class[] paramTypes = m.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++) {
				if (j > 0)
					System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}

	/**
	 * Prints all fields of a class
	 */
	public static void printFields(Class cl) {
		Field[] fields = cl.getDeclaredFields();

		for (Field f : fields) {
			Class type = f.getType();
			String name = f.getName();
			System.out.print("   " + Modifier.toString(f.getModifiers()));
			System.out.println(" " + type.getName() + " " + name + ";");
		}
	}
}













分享到:
评论

相关推荐

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    反射-类加载之间的关联关系

    【反射-类加载之间的关联关系】 1、 使用反射方法强制创建某各类或者接口对应的java.lang.Class对象时,会进行类加载,(而类加载会将字节码的class文件读入内存,并为之创建一个Class对象)。 2、 反射让类加载了,...

    JAVA基础-反射-枚举

    1. **Class类**:`Class`类用来描述内存中的`.class`字节码文件。每一个`Class`对象代表内存中的一个`.class`文件。 - **获取Class对象的方式**: - 通过类名获取:`Class.forName("com.example.MyClass")` - ...

    652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652).rar

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个教程"652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652)"显然是针对Java反射机制的深入学习,...

    658.656.JAVA基础教程_反射-调用运行时类中的指定构造器(658).rar

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段以及方法等对象。在"658.656.JAVA基础教程_反射-调用运行时类中的指定构造器(658).rar"这个压缩包文件中,我们很显然会学...

    折射-反射-枚举-单元测试综合案例

    通过java.lang.Class类和相关API,我们可以动态地创建对象、调用方法、访问和修改属性,甚至执行私有方法。反射在许多场景下都很有用,比如序列化、框架设计、元数据处理等。 3. **枚举**:枚举是Java中的数据类型...

    4.反射-introdute.doc

    1. **Class类**:`java.lang.Class`是Java反射的基础,它代表了Java中的每一个类或接口。通过`Class`对象,我们可以获取到类的各种信息,如类名、构造器、方法、字段等。 2. **获取Class对象**: - `Class.forName...

    第12章 反射-课后习题1

    3. `java.lang.reflect`包中的关键类:`Class`类用于表示Java类和接口,`Constructor`类代表类的构造器,`Method`类表示类的方法,`Field`类则封装了类的字段或属性。 4. 获取类的全部接口:使用`Class....

    java习题-反射-chap15.pdf

    Chp15 反射Key Point ●Class 对象及其基本操作●Method 对象以及invoke 方法●标注练习 1. (类对象)要获得类对象,有三种不同的方式,分别为_____________________、___________________、_____________________...

    Java 反射-动态代理

    它主要通过java.lang.Class类和java.lang.reflect包中的类(如Constructor、Method和Field)来实现。以下是一些核心知识点: 1. 获取Class对象:可以通过Class.forName()方法、对象.getClass()方法或类名.class来...

    java反射 反编译:.class--&gt;.java

    Java反射机制是Java编程语言中一个非常重要的特性,它允许程序在运行时动态地获取类的信息并进行操作。反射机制的核心在于,它打破了程序在编译时的静态性,使得程序能够在运行时发现并调用类、接口、字段和方法等...

    (02)2020.4.26 Java高级语言特性,注解与反射---lance老师.rar

    反射的核心类包括Class、Constructor、Method和Field。Class对象代表Java类,可以用来获取类的元数据,包括类名、父类、接口、构造函数、方法和字段。Constructor表示类的构造函数,Method表示类的方法,Field表示类...

    dynamic-load-class-parent.zip

    "dynamic-load-class-parent.zip"这个压缩包可能包含了一些示例代码或教程,旨在帮助我们理解并实践Java中的动态类加载机制。下面我们将深入探讨这个主题。 1. **类加载器(ClassLoader)**: 类加载器是Java虚拟机...

    java反射-在form提交的一些应用

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。在“java反射-在form提交的一些应用”这个主题中,我们将探讨如何利用反射机制来处理HTML表单提交的数据,以及...

    dynamic-class.rar_自动创建类

    而在Java中,动态类创建通常涉及反射(Reflection)和Java的`Class`对象。通过`Class.forName()`方法,可以加载指定名称的类。如果需要在运行时创建类,可能需要使用`java.lang.reflect.Proxy`或字节码操作库如ASM或...

    655.653.JAVA基础教程_反射-获取运行时类的接口、所在包、注解等(655).rar

    Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个教程"655.653.JAVA基础教程_反射-获取运行时类的接口、所在包、注解等(655)"将深入讲解如何利用反射获取...

    反射私有内部类的例子

    // 使用反射获取私有内部类的Class对象 Class clss = Class.forName("org.wind.oms.fm.main.DefaultHandler$PThread"); // 获取私有内部类的构造器 Constructor conn = clss.getDeclaredConstructors()[0]; ...

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

    1. **获取枚举类**:要通过反射获取枚举类,首先需要得到其Class对象。这可以通过`Class.forName()`方法完成,提供枚举类的全限定名作为参数。 ```java Class&lt;Color&gt; colorClass = (Class) Class.forName(...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试复杂的Java应用程序尤其有用。 首先,我们来理解什么是反射。在Java中,类、接口和方法等都是由类对象表示的,这些类...

    java 反射-(reflect)

    在Java中,反射机制的核心类是`java.lang.Class`,它代表了类的信息。通过反射,我们可以动态地创建对象、调用方法、访问字段,甚至可以操作私有成员,这对于单元测试、插件系统、动态代理等场景非常有用。 一、...

Global site tag (gtag.js) - Google Analytics