Java的反射(reflection)机制是指在程序的 运行状态 中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。undefined ——百度百科
JVM有一个运行时数据区,这个运行时数据区分为方法区,堆区和栈区,我们能够通过反射机制获取的class信息就是存储在方法区中的,这里的Class信息是通过.java文件编译成.class文件,然后由类加载器装载运行时数据区时,在方法区中就会产生对应的Class实例。
我们可以通过 反射机制 从方法区中 获取相应的Class实例,然后就可以获取到对应类型的函数、属性、父类、接口等 Class 内部信息
,说反射机制就有点高大上了,说白了,就是能够让我们拿到Class内部信息的一种方式
反射机制的 原理就是直接读取存在方法区中的Class实例
,至于读取信息的步骤则是严格按照.class文件的格式来读取的,.class文件的读取可以参考【JVM】带你解读字节码
先创建一个User类
public class User implements Serializable { private String name; private Integer age; public User() { } public User(String name, Integer age) { this.name = name; this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }} //1.类的静态属性class Class userClass=User.class; //2.Object类对象的getClass方法 User user=new User(); Class userClass1=user.getClass(); //3.Class类静态方法forName Class userClass2=Class.forName("model.User");相关类: Class,Constructor,Field,Method
;其中Class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象
后面三个类的获取都需要通过Class类
/** * @author xxj
* 反射机制测试
*/
public class ReflexDome {
public static void main(String[] args) throws Exception{
//类的静态属性class
Class userClass=User.class;
System.out.println("User");
System.out.println("User的类加载器:"+userClass.getClassLoader());
System.out.println("User的全限定名:"+userClass.getName());
System.out.println("User的父类全限定名:"+userClass.getSuperclass());
System.out.println("User是否是接口类型:"+userClass.isInterface());
Class[] interfaces= userClass.getInterfaces();
for (Class i:interfaces) {
System.out.println("user的实现接口全限定名:"+i.getName());
} TypeVariable[] typeParam=userClass.getTypeParameters(); for (TypeVariable variable:typeParam) { System.out.println("User的访问修饰符:"+variable.getName()); } System.out.println("------------------Field"); Field[] fields=userClass.getFields(); for (Field i :fields) { System.out.println("User的public字段信息:"+i); } Field[] privateFields=userClass.getDeclaredFields(); for (Field i:privateFields) { System.out.println("User的private字段信息:"+i); } System.out.println("---------------Methods"); Method[] methods=userClass.getMethods(); for (Method i:methods ) { System.out.println("User的方法信息:"+i); } System.out.println("---------------Constructor"); Constructor[] constructors= userClass.getConstructors(); for (Constructor i:constructors) { //通过newInstance()方法,可以构造一个对象 System.out.println("User的构造方法:"+i); } }}原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。