反射(基础知识)

一、反射的概念

反射是java语言提供的一项非常吸引人的特性,利用反射可以在运行时对程序进行动态的控制。开发使用反射特性的程序需要使用一套专门的工具类,这些类大部分都位于java.lang.reflect包中。

二、Class类

Class类属于java.lang包,不需要使用import语句引入特殊的包就可以使用,其对象代表一个类,携带类的相应信息,主要包括构造器、方法、成员变量等。其实,java程序运行过程中,每个类被加载都在内存中产生一个对应的Class类对象,在普通应用程序中这些对象是由系统自动维护的,开发人员不需要关心。

1、对类和对象的理解

(1)在面向对象的世界里,万事万物皆对象

(2)java语言中静态的成员、普通数据类型类不是对象。

(3)类是对象,类是java.lang.Class类的实例对象。(任何一个类都是Class的实例对象)

2、任何类都是Class的实例对象,这个实例对象有三种表示方式(可以通过三种方式获取Class类对象)

类类型不可以使用Class类的构造器来创建Class类对象,只能使用其提供的静态工厂方法来获取对象。

(1)实际上,在告诉我们任何类都有一个隐含的静态成员变量Class,所以可以通过下面方式获取Class类对象

Class c1=FOO.class;                         //   FOO是一个类

(2)已知一个类的实例对象,通过getClass方法获取Class类对象

1 FOO foo=new FOO();

2  Class c1=foo.getClass();

注:c1,c2都代表了FOO类的Class类对象,但是一个类只可能是Class类的一个实例对象。

 1 package Reflect;
 2
 3 public class Test {
 4
 5     public static void main(String[] args) {
 6         FOO foo=new FOO();
 7         Class c=foo.getClass();
 8         Class c1=FOO.class;
 9         System.out.println(c1==c);
10     }
11 }

运行结果:

true

(3)通过Class.forName(String className),className指出类的全称名。,如果找不到,就会抛出ClassNotFoundException异常

1     try {
2             Class c3=Class.forName("Reflect.FOO");
3         } catch (ClassNotFoundException e) {
4             // TODO Auto-generated catch block
5             e.printStackTrace();
6         }
7     }

3、Class类的常用方法

Class类没有构造方法,所以很自然创建Class类对象,不能通过构造器来创建,而只能通过其提供的静态工厂方法来获取对象。Filed、Method、Constructor为java.lang.reflect包的类,它们分别代表了成员变量、方法、构造器,分别携带对应成员变量、方法、构造器信息。package类在java.lang包中,其对象代表一个包,携带相应包的信息。

Class类的常用方法表


方法关键字


含义


public Method[] getDeclaredMethods()


获取声明的所有的方法


public Method getDeclaredMethod("方法名",参数类型.class,……)

获得特定的方法

public Constructor[] getDeclaredConstructors()


获取所有声明的构造方法


public Constructor[] getConstructors()


获取所有的构造方法


public Constructor getDeclaredConstructor(参数类型.class,……)

获取特定的构造方法
public Field[] getFields()
获取所有成员变量

public  Field[] getDeclaredFields()
获取所有声明的成员变量


public  Field getField(String name)


获取指定的成员变量


public Package getPackage()


返回Class对象所对应类所在的包


public String getName()


返回Class对象对应类的名称


public static Class forName(String className)

通过此方法获取指定名称的类对应的Class对象,className指出类的全名称

Public Object newInstance()

调用默认的无参构造器新建Class对象对应类的一个对象。

注:标红的两个方法是Class类实现动态加载类的核心方法。

通过newInstance()方法创建的对象与普通方式创建的对象在使用上完全相同(区别:用于动态加载类后的实例化)。

代码示例:

 1 package Reflect;
 2
 3 public interface OfficeAble {
 4
 5     public void start();
 6 }
 7
 8
 9 package Reflect;
10
11 public class Word implements OfficeAble {
12
13     private String name;
14     private String gender;
15     public Word() {
16         System.out.println("word的构造方法1~~");
17     }
18
19     public Word(String name,String gender) {
20         this.name=name;
21         this.gender=gender;
22         System.out.println("word的构造方法1~~"+name+" "+gender);
23     }
24
25     @Override
26     public void start() {
27         System.out.println("word..start.......");
28     }
29
30     public void start1() {
31         System.out.println("word..start1.......");
32     }
33
34 }
35
36 package Reflect;
37
38 import java.lang.reflect.Constructor;
39 import java.lang.reflect.Field;
40 import java.lang.reflect.Method;
41
42 public class OfficeBetter {
43
44     public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
45         //动态加载类,在运行时刻加载
46         Class c=Class.forName("Reflect.Word");
47         //通过类类型,创建该类对象
48         OfficeAble oa=(OfficeAble) c.newInstance();
49         oa.start();
50
51         //获取Word类中所有构造函数对象,所有成员变量对象,所有方法对象
52         Constructor []cs=c.getConstructors();
53         Field []fd=c.getFields();
54         Method []md=c.getMethods();
55
56         //遍历构造函数对象,成员变量对象,方法对象,打印他们的信息
57         for (Method method : md) {
58             System.out.println(method.getName()+" "+method.getParameterCount());
59         }
60
61         for (Field field : fd) {
62             System.out.print(field.getName()+" ");
63         }
64         System.out.println();
65
66         for (Constructor constructor : cs) {
67             System.out.println(constructor.getName()+" "+constructor.getParameterCount());
68         }
69     }
70
71 }

运行结果:

 1 word的构造方法1~~
 2 word..start.......
 3 start 0
 4 start1 0
 5 wait 0
 6 wait 2
 7 wait 1
 8 equals 1
 9 toString 0
10 hashCode 0
11 getClass 0
12 notify 0
13 notifyAll 0
14
15 Reflect.Word 0
16 Reflect.Word 2
时间: 2024-10-08 10:13:44

反射(基础知识)的相关文章

C#反射基础知识和实战应用

首先来说一下什么是反射? 反射提供了封装程序集.模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 . 总之,有了反射,以前很多实现不了的功能都可以实现. 下面先来写一个小例子,体验一下反射是怎么一回事: 打开VS2010,新建一个控制台应用程序,在program.cs里面写代码 首先引入命名空间: using System.Reflection; 下如下代码: PropertyInfo l

java反射基础知识(一)

一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 要想解剖一个类,必须先要获取到该类的字节码文件对象.而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.对于反射的操作实际上就是通过Class对象获取: *a.java.lang.reflect.Field:提供有关类或接口的单个

java反射基础知识(四)反射应用实践

反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类Class,在Java中我们有三种方法可以获取一个对象的反射类. 通过getClass方法 在Java中,每一个Object都有一个getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类: 1 2 String s = "ziwenxie"; Class

java反射基础知识(二)

1. 了解 Java 中的反射 1.1 什么是 Java 的反射 Java 反射是可以让我们在运行时获取类的函数.属性.父类.接口等 Class 内部信息的机制.通过反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值,即使方法或属性是私有的的也可以通过反射的形式调用,这种"看透 class"的能力被称为内省,这种能力在框架开发中尤为重要. 有些情况下,我们要使用的类在运行时才会确定,这个时候我们不能在编译期就使用它,因此只能通过反射的形式来使用在运

java反射基础知识(五)反射应用实践

详解Java反射各种应用 Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息.通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: Class对象 构造器 变量 方法 私有变量与私有方法 注解 泛型 数组 本文也将从上面几个方面来介绍Java反射.本文涉及的所有代码均在反射代码首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnab

Java反射基础笔记

由于工作中发现自己的基础知识掌握的并不是很牢固,遇到的问题与学习的东西也没有很好的做过记录,导致再遇到时耗费大量时间上网搜索,所以决定串下基础知识并尽量形成记录,方便自己之后遗忘时查询,也方便各位有需求的伙伴翻阅查看,大家共同探讨.学习. 本次梳理的是Java反射的基础,该系列为笔者学习慕课反射讲解视频的学习笔记,尽可能全的记录,以帮助初学者快速掌握反射基础知识,如需转载该系列请注明原文链接. 一.反射之Class类的使用 二.反射之获取方法信息 更多编辑中 --

反射基础详解

附:本博文记录反射基础知识,扩展请参见反射目录下的其余博文. 一.通过一个对象获得完整的包名和类名 方法:class.getClass().getName(). 二.实例化Class类对象 有三种方法: 1.推荐此种方式进行构建类:Class.forName("className"); 2.java的任何一个java对象都有getClass方法; 3.每个类都有class属性:className.class. 一.二点详见示例代码: package temp.reflect; publ

Java基础知识——类装载器与反射机制

类装载器ClassLoader 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件. 类装载器把一个类装入JVM中,要经过三步: 1.装载:查找和导入Class文件: 2.链接:执行校验.准备和解析(解析是可以选择的): 3.初始化:对类的静态变量.静态代码块执行初始化工作: 类装载工作由ClassLoader及其子类负责.JVM在运行时会产生三个ClassLoader:根装载器.ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器). 根装

编程基础知识——C++能不能支持Java和ObjC的反射?

C++能不能支持Java和ObjC的反射? 要回答这个问题,首先我们要清楚什么是反射.什么是反射? 教科书的解释我就不说了,(^o^)其实我也记不得.实际开发应用的反射就是在没有某个类型的头文件或者类结构定义的情况下,存取这个类型的对象的成员字段的值,调用这个对象的成员函数(方法). 比如我有定义了一个类型 Class  A,里面有 a,b,c三个字段,有fun()函数.现在我手里只有一个 void* pA,注意它的类型只是一个void指针,我手里也没有Class的头文件,我要怎么样得到,a,b

学习Spring必学的Java基础知识(1)----反射

引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助.): [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293 [3] 属性