一般在开发中很少自己刻意去使用反射,但是在某些情况下反射却显得异常有用。在Java开发中反射几乎可以称之为万能公式,因为在某些时候它确实是万能的。一些常用的开发框架如Gson以及Web开发的SSH框架底层几乎无一例外采用反射机制,再如目前比较流行的使用注解的方式底层解析也是使用反射,所以反射几乎是学习Java进阶的不二之路。
反射简介
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
那么反射可以做什么呢?
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
在Java中Object类是所有类的父类,Object提供了一个很多非常有用的方法如equals()、notify()、wait()、clone()等等,但是还有一个很少用却非常有用的方法getClass()方法,getClass()方法返回的是一个Class对象,Class对象是执行反射操作的关键所在。更多有关Class的介绍会在后续文章中进一步深入探讨,本篇文章重点介绍一下反射的基础知识点。
Class位于java.lang包下面,但是所有反射相关的API基本位于java.lang.reflect子包下面。先看一下获取java.lang.Class对象的常用方式。
Class类的静态方法forName(String className)。其中传入的className参数为类的全类名(包含具体包名的类名)。
调用类的class属性来获取该类的Class对象。如Class strClass = String.class。
调用对象的getClass()方法。
反射部分常用方法介绍
在进行介绍之前,先看一下反射中我们使用的一个测试类User。
public class User implements Serializable{ private static final long serialVersionUID = 1L; private String id; public String username; private int age; public User(){} private User(String id){ this.id=id; } public User(String id,String username, int age) { this.id = id; this.username = username; this.age = age; } private void printId(){ System.out.println("this is private method"); } public static void printName(){ System.out.println("this is static method"); } public void sayHello(){ System.out.println("hello world"); } public void sayHello(String str){ System.out.println("hello:"+str); } public String toString() { return "User [username=" + username + ", age=" + age + ", id=" + id + "]"; } } public class User implements Serializable{ private static final long serialVersionUID = 1L; private String id; public String username; private int age; public User(){} private User(String id){ this.id=id; } public User(String id,String username, int age) { this.id = id; this.username = username; this.age = age; } private void printId(){ System.out.println("this is private method"); } public static void printName(){ System.out.println("this is static method"); } public void sayHello(){ System.out.println("hello world"); } public void sayHello(String str){ System.out.println("hello:"+str); } public String toString() { return "User [username=" + username + ", age=" + age + ", id=" + id + "]"; } } |
获取类的Class实例
上面已经介绍了可以通过三种方式获取Class实例,事实上三种方式获取到的Class实例是同一个。
User user = new User(); System.out.println(User.class); System.out.println(user.getClass()); System.out.println(Class.forName("com.yimi.demo.bean.User")); System.out.println(User.class == user.getClass()); System.out.println(User.class == Class.forName("com.yimi.demo.bean.User")); //class com.yimi.demo.bean.User //class com.yimi.demo.bean.User //class com.yimi.demo.bean.User //true //true User user = new User(); System.out.println(User.class); System.out.println(user.getClass()); System.out.println(Class.forName("com.yimi.demo.bean.User")); System.out.println(User.class == user.getClass()); System.out.println(User.class == Class.forName("com.yimi.demo.bean.User")); //class com.yimi.demo.bean.User //class com.yimi.demo.bean.User //class com.yimi.demo.bean.User //true //true |