Java

在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());
    }
}



转载请指明出处!http://www.miselehe.com/article/view/3