疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java反射机制连载Constructor类


 

 
 
反射Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性,简单的说就是把Java类中的各种成分映射成一个个的java对象。
例如,一个类有:构造器(Constructor)、字段(Field),方法(Method)等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
 
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
 
Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。
反射技术更多的是用来增强扩展性功能,在SSH框架里面大量运用了反射功能。Struts中的MVC、Hibernate中的ORM和Spring中的IOC都是利用了Java的反射机制来实现的。所以我们学好反射非常重要。
 
学习反射要掌握的重点知识:
Class
Constructor
Field
Method
Property
 
下面介绍Constructor类。
 
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。如果调用有参数的构造器,只能使用Constructor对象。
 
Constructor类没有构造器,只能通过Class获得。
Class获得Constructor的方法:
 
public Constructor<?>[] getConstructors()
返回:
    表示此类公共构造方法的 Constructor 对象数组 
 
public Constructor<T> getConstructor(Class<?>... parameterTypes)
参数:
    parameterTypes - 参数数组 
返回:
    与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象
 
Constructor的重点方法:
public T newInstance(Object... initargs)
参数:
    initargs - 将作为变量传递给构造方法调用的对象数组;
返回:
    通过调用此对象表示的构造方法来创建的新对象
 
 
示例代码:
import java.lang.reflect.Constructor;
 
public class TestConstructor_1 {
    /**
     * 获得构造器
     * */
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("org.fkjava.bean.User");
            // 获得所有构造器
            Constructor<?>[] cs = clazz.getConstructors();
            // 遍历
            for(Constructor<?> c : cs){
                System.out.println(c.getName() + "    " + c.getParameterCount());
                // 获得当前构造器的所有的参数类型
                Class<?>[] parameterTypes = c.getParameterTypes();
                if(parameterTypes!= null && parameterTypes.length > 0){
                    for(Class<?> p : parameterTypes){
                        System.out.print(p.getName() + " ");
                    }
                    System.out.println();
                }
                System.out.println("===============");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
}
复制代码
 
public class TestConstructor_2 {
 
    /**
     * 通过无参数构造器创建实例
     * */
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("org.fkjava.bean.User");
            // 获得无参数构造器 
            // public Constructor<T> getConstructor(Class<?>... parameterTypes)
            Constructor<?> c = clazz.getConstructor();
            // 通过构造器创建实例
            // public T newInstance(Object... initargs)
            Object o = c.newInstance();
            
            System.out.println("o -->> " + o);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
}
复制代码
public class TestConstructor_3 {
 
    /**
     * 通过有参数构造器创建实例
     * */
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("org.fkjava.bean.User");
            // 获得有参数构造器 public User(String name, String sex, Integer age)
            // public Constructor<T> getConstructor(Class<?>... parameterTypes)
            Constructor<?> c = clazz.getConstructor(String.class,String.class,Integer.class);
            // 调用有参数构造器创建实例
            // public T newInstance(Object... initargs)
            // new User("jack","男",20);
            Object o = c.newInstance("jack","男",20);
            System.out.println("o -->> " + o);
        } catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
}
复制代码
 
Constructor类在反射中使用的情况大多数都是调用有参数构造器。