深入浅出Java反射机制

本文介绍了Java反射机制的概念及其应用场景,详细解析了反射机制如何帮助程序员在运行时动态地获取类的信息并调用其方法,同时提供了核心API的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是Java反射机制

Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。

用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。

2.为什么要有Java反射机制

我们为什么要用Java的反射机制呢?

我认为有两种:

       第一种:反射的目的就是为了扩展未知的应用。比如你写了一个程序,这个程序定义了一些接口,只要实现了这些接口的dll都可以作为插件来插入到这个程序中。那么怎么实现呢?就可以通过反射来实现。就是把dll加载进内存,然后通过反射的方式来调用dll中的方法。

       第二种:在编码阶段不知道那个类名,要在运行期从配置文件读取类名, 这时候就没有办法硬编码new ClassName(),而必须用到反射才能创建这个对象。

一个生活中常看到的例子有助于理解我们为什么要用Java的反射机制:你进了一家饭店,你不知道他们都有那些菜,要多少钱。那么你第一件事情是干啥“服务员拿个菜单过来”,然后指着菜单说“我要这个,我要那个”。

3.看下反射API(java.lang.Reflect)


Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。 
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。 
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。 
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。 
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

我们能够通过这些接口做些什么呢?

从上篇API中我们能看到它能够完成下面的这些功能:

获得类

A.     运用getClass()  (每个class都有此函数)

                                    i.    String str = "abc";

                                  ii.    Class c1 = str.getClass();

 

B.     运用Class.forName() (static method 最常被使用)

                                    i.    Class c1 = Class.forName ("java.lang.String");

                                  ii.    Class c2 = Class.forName ("java.awt.Button");

C.     运用  .class 语法

                                    i.    Class c1 = String.class;

                                  ii.    Class c2 = java.awt.Button.class;

                                iii.    Class c4 = int.class;

                                  iv.    Class c5 = int[].class;

D.     运用 TYPE语法 ( primitive wrapper classes 基本数据类型包装类的 TYPE语法)

                                    i.    Class c1 = Boolean.TYPE;

package com.jwd;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect {
	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws ClassNotFoundException {
		String str = "abc";
        Class c1 = str.getClass();
        Class c2 = Class.forName("java.lang.String");
        Class c3 = String[].class;
        Class c4 = Integer.TYPE;
		Method[] mh = c1.getDeclaredMethods();
        Method[] mh2 = c2.getDeclaredMethods();
        Method[] mh3 = c3.getDeclaredMethods();
        Method[] mh4 = c4.getDeclaredMethods();
        Field[] f1 = c1.getDeclaredFields();
        Field[] f3 = c1.getDeclaredFields();
        Constructor[] ct = c1.getDeclaredConstructors();
		for(Method a:mh){
			System.out.println(a.toString());
		}
		for(Field a:f3){
			//System.out.println(a.toString());
		}
		for(Constructor a:ct){
			//System.out.println(a.toString());
		}
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值