在Java程序运行时,通过Java反射(reflection)机制使用java.lang.Class类可以获得类、构造方法、成员方法和成员变量等信息。
Java反射机制常用类:
java.lang.Class : 类的定义
java.lang.reflect.Constructor : 类的构造方法
java.lang.reflect.Field : 类的属性\变量
java.lang.reflect.Method : 类的方法
java.lang.reflect.Parameter : 类的方法参数
示例代码:
package com.miselehe.reflection; import java.io.Serializable; import java.util.Date; public class Article implements Serializable { private static final long serialVersionUID = 0L; private Long id; private String title; private String content; private Date createTime; public Article() { } public Article(Long id) { this.id = id; } private Article(String title) { this.title = title; } public Article(Long id, String title) { this.id = id; this.title = title; } }
获取类的Class对象
获取类的Class对象的方式:
1. 通过java.lang.Class类的forName()方法;
2. 通过类的class属性;
3. 通过类的实例的getClass()方法;
代码举例:
try { // 通过Class.forName()方法获取Class对象实例 Class clazz = Class.forName("com.miselehe.reflection.Article"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 通过类的class属性获取Class对象实例 Class<Article> clazz = com.miselehe.reflection.Article.class; // 使用对象实例的getClass()方法获取对应类的Class对象实例 Class<? extends Article> clazz = new Article().getClass();
创建对象
创建对象方式:
1. 使用java.lang.Class类的 newInstance() 方法。要求对应的类必须提供无参构造方法。
2. 使用java.lang.reflect.Constructor类的newInstance(Object ... initargs)。
代码举例:
Class<Article> clazz = com.miselehe.reflection.Article.class; // 使用 java.lang.Class 类的 newInstance() 方法 Article article = clazz.newInstance(); // 通过 java.lang.Class 类的 getConstructor(Class<?>... parameterTypes)获取对应构造方法 Constructor<Article> articleConstructor = clazz.getConstructor(Long.class); // 通过构造方法java.lang.reflect.Constructor类的 newInstance(Object ... initargs)方法,创建对象 Article article = articleConstructor.newInstance(100L); // 多个参数 Article article = clazz.getConstructor(Long.class, String.class).newInstance(100L, "文章标题");
获取类的构造方法:
1. 从当前Class对应类的构造方法中,获取指定参数列表的公共构造方法 (public修饰的)
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
2. 从当前Class对应类的所有构造方法中,获取所有公共构造方法 (public修饰的)
public Constructor<?>[] getConstructors() throws SecurityException
3. 从当前Class对应类的所有构造方法中,获取指定参数列表的构造方法(包括非public修饰的)
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
4. 从当前Class对应类的所有构造方法中,获取所有构造方法(包括非public修饰的)
public Constructor<?>[] getDeclaredConstructors() throws SecurityException
代码举例:
// 获取所有构造方法 Constructor<?>[] constructors = clazz.getDeclaredConstructors(); // 获取所有公共构造方法 // Constructor<?>[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println("参数个数:" + constructor.getParameterCount()); // 获取构成方法参数类型 Class[] parameterTypes = constructor.getParameterTypes(); for (Class parameterTypeClazz : parameterTypes) { System.out.println(parameterTypeClazz.getName()); } }