`

反射 - 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对象的获取.pdf

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

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

    java习题-反射-chap15.pdf

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

    Java基础 反射篇.md

    - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - 获取类的构造器(Constructor) - 获取注解 - 通过反射调用方法 - 反射的...

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

    二,反射机制的作用: 1,反编译:.class--&gt;.java 2,通过反射机制访问java对象的属性,方法,构造方法等; 这样好像更容易理解一些,下边我们具体看怎么实现这些功能。

    第12章 反射-课后习题1

    第12章 反射一、填空题1.反射机制的优点是可以实现创建对象和编译。2.如果想通过Class类实例化其他类的对象,则可以使用方法,但是必须要保证被实例化的类中存

    反射分析类反射分析类

    反射分析类源码,完整的分析.CLASS中的属性,方法等

    利用JAVA注解与反射 - 实现SQL语句自动生成

    SqlUtil.create(Person.class) SqlUtil.insert(Person.class) SqlUtil.insert(Person.class,person) SqlUtil.updateById(Person.class,person) SqlUtil.deleteById(Person.class,person) 开发工具IDEA,MAVEN...

    反射+Class+获取和操作+入门

    反射+Class+获取和操作+入门 - 本资源是一个反射的入门,教你如何用Java的Class类获取和操作类的信息,包括构造器,方法,字段,注解,泛型等。

    JavaClassViewer:使用iava反射查看类文件的所有详细信息

    Java类文件查看器/反射器 Java程序使用反射来查看类文件的详细信息。 它与jdk中的javap命令有点类似,但显示了更多有组织的细节。 安装 从下面的zip下载并解压缩代码/类文件。 用法 代码 将类目录yourDirectory/...

    Data-Class-Java:带有反射的数据类

    数据类Java具有反射的Java中的数据类,例如Scala案例类当我们将对象打印到输出流时,java将是对象的打印哈希码。 我创建了Java反射练习。 当调用toString()方法时,返回所有具有漂亮打印名称和值对的类变量作为...

    java 反射Reflection;Class类

    java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息、类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体信息。 Reflection(反射) 是被...

    Java常用的反射方法

    反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有public修饰符的成员变量 3.2 获取指定字段并赋值 3.3 获取...

    java反射JAVA REFLECT (java 反射)

    JAVA REFLECT (java 反射) 取得类的继承结构 - 类所在的包; |- public Package getPackage() - 类的声明方式; |-取得全类名:public String getName() |-只取类名: public String getSimpleName() - 类所继承...

    java反射jar包中class,并可进行文件比较

    java反射jar包中class,并可进行文件比较

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    Java的反射机制是指在运行时通过分析类的信息实现动态调用类的方法和访问类的属性的能力。它允许程序在运行时获取类的信息并操作类或对象的属性、方法和构造函数等。通过反射机制,可以实现很多高级特性,如动态代理...

    Java基础[08-反射].ppt

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    【Java】反射机制介绍与Class类的基本能使用(工厂模式)

    Java反射机制与Class类1.Java反射机制1.1 反射机制是什么1.2 反射的应用场合1.3 反射的常用类1.4 反射使用步骤2. Class类2.1 常用方法和示例2.2 获取Class对象的 3 种方法2.3 反射创建对象的 2 种方法3. 工厂设计...

    Java学习day034 反射(一)Class类、捕获异常、利用反射分析类的能力

    day034 反射(一)Class类、捕获异常、利用反射分析类的能力 反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。这项功能被大量地应用于JavaBeans中,它是...

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    加载完类之后,在堆内的方法区中就产生了一个Class类型的对象(一个类只有一个class对象),这个对象就包含了完整类的结构信息,我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构...

Global site tag (gtag.js) - Google Analytics