首先,介绍下Class类:Class类也是一个java类,不同的是类名比较特殊。我们将现实生活中具有相同特点的一类事物进行抽象,在代码中通过类的定义进行表示。因为我们定义的类通常也具有某些共性,例如类名、属性和方法等,所以我们在此基础上,又进行了二次抽象和封装,将我们定义的类抽象成特殊类Class的对象。
然后,我们来看一下百度百科对Java反射机制的定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
然后,我们来看一下百度百科对Java反射机制的定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
我对它的理解是:在程序运行过程中,我们无需具体实例化一个对象,就可以通过Class类的相关属性和方法加载并获取调用任何一个已存在类的属性和方法,当然在反射中用的最多的是这种方法,还有其他方法在这里不做解释!
前提:因为Class 类的构造方法是私有的,只有 Java 虚拟机可以创建该类的对象,因此我们无法在代码中显式地声明一个 Class 对象,但是我们可以通过以下几种方法获取:
package com.cyn;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Person {
private String name;
private int age;
public Person(){
System.out.print("无参构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args){
/*
* 获取Class对象的三种方法:
*/
//1.通过类的静态成员表示,每个类都有一个隐含的静态成员class:
Class c1 = Person.class;
System.out.print(c1+"\n");
//2.通过类对象的 getClass()方法
Person person = new Person();
System.out.print(person.getClass()+"\n");
try {
//3.通过 Class 类的静态方法 forName() 方法获取 Class 的对象
Class c2 = Class.forName("com.cyn.Person");
System.out.print(c2.getName()+"\n");
// 获取指定类中的所有方法
Method method[] = c2.getDeclaredMethods();
for(Method m : method){
System.out.print(m.getName()+"\n");
}
//获取指定类中的所有属性
Field file[] = c2.getDeclaredFields();
for(Field f : file){
System.out.print(f.getName()+"\n");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
class com.cyn.Person
无参构造方法class com.cyn.Person
com.cyn.Person
main
getName
setName
getAge
setAge
name
age