Constructor详解

Constructor 提供获取构造方法信息,并可生成实例。
一个构造方法的属性有:
方法上使用的注解、方法的修饰符、方法上定义的泛型参数、方法名称、方法参数(泛型、注解)、方法抛出的异常。

比如下面这个方法:

@MyAnnotation
public <T>  ConstructorTest(@MyAnnotation List<T> list, T... params) throws RuntimeException,
		Exception {
	
}
注解:@MyAnnotation
修饰符:public
泛型参数:T
方法名:ConstructorTest
方法参数(泛型、注解):List<T> list,T...params
抛出的异常:RuntimeException,Exception


以上就是一个完整构造方法的所有信息,当然构造函数的主要作用还是用来生成对象实例的。

下面我们来看看构造函数信息

package reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author zhangquanit
 */
public class ConstructorTest<T> {

	private List<T> mList;
	private T[] mParams;

	public ConstructorTest(){
		
	}
	@MyAnnotation
	public ConstructorTest(@MyAnnotation List<T> list, T... params)
			throws RuntimeException, Exception {
		this.mList = list;
		this.mParams = params;

	}

	public static void main(String[] args) throws Exception {
		// 获取构造函数
		Constructor<ConstructorTest> constructor = ConstructorTest.class
				.getDeclaredConstructor(List.class, Object[].class);
		if (!constructor.isAccessible()) {
			constructor.setAccessible(true);
		}
		// 构造函数信息
		constructorInfo(constructor);

		// 创建实例
		List<String> arrayList = new ArrayList<String>();
		arrayList.add("1");
		arrayList.add("2");
		ConstructorTest instance = constructor.newInstance(arrayList,
				new String[] { "2", "2" });
		List<String> list=instance.mList; //[1,2]
		String[] mParams=(String[]) instance.mParams;//[2,2]
		
		//默认构造方法创建实例
		Constructor<ConstructorTest> defaultConstructor= ConstructorTest.class.getDeclaredConstructor();
		ConstructorTest instance2=defaultConstructor.newInstance();
		
		//构造函数所在的类
		Class<ConstructorTest> declaringClass = constructor.getDeclaringClass();
		//如果此构造方法是一个复合构造方法,则返回 true
		boolean synthetic = constructor.isSynthetic(); //false
		//构造方法参数中是否包含可变参数
		boolean varArgs = constructor.isVarArgs(); //true
	}

	private static void constructorInfo(Constructor constructor) {
		// 1、注解
		boolean annotationPresent = constructor
				.isAnnotationPresent(MyAnnotation.class);
		if (annotationPresent) {
			MyAnnotation myAnnotation = constructor
					.getDeclaredAnnotation(MyAnnotation.class);
		}
		Annotation[] declaredAnnotations = constructor.getDeclaredAnnotations();

		// 2.修饰符
		int modifiers = constructor.getModifiers();
		String modify = Modifier.toString(modifiers);// public transient

		// 3、定义在构造方法上的泛型
		TypeVariable[] typeParameters = constructor.getTypeParameters();
		System.out.println(Arrays.toString(typeParameters));

		// 4、构造方法名
		String name = constructor.getName();// reflect.ConstructorTest

		// 5、构造方法参数
		int parameterCount = constructor.getParameterCount();
		// 方法参数类型
		Class<?>[] parameterTypes = constructor.getParameterTypes();
		// 打印 [interface java.util.List, class [Ljava.lang.Object;]
		Type[] genericParameterTypes = constructor.getGenericParameterTypes();
		// 打印 [java.util.List<T>, T[]]
		for (Type type : genericParameterTypes) {
			if (type instanceof ParameterizedType) { // 参数类型
				System.out.println("ParameterizedType类型:" + type);
				ParameterizedType parameterizedType = (ParameterizedType) type;
				Type[] actualTypeArguments = parameterizedType
						.getActualTypeArguments();
				System.out.println("实际参数为:"
						+ Arrays.toString(actualTypeArguments));
				for (Type actualType : actualTypeArguments) {
					if (actualType instanceof WildcardType) {
						WildcardType wildcardType = (WildcardType) actualTypeArguments[0];
						System.out.println("实际参数为WildcardType类型:"
								+ wildcardType.getUpperBounds());
					} else if (actualType instanceof Class) {
						System.out.println("实际参数为Class类型:" + actualType);
					}
				}

			} else if (type instanceof GenericArrayType) { // 泛型数组类型 T[]
				GenericArrayType genericArrayType = (GenericArrayType) type;
				System.out.println("GenericArrayType类型:"
						+ genericArrayType.getGenericComponentType());// T
			} else if (type instanceof TypeVariable) { // 泛型变量
				System.out.println("TypeVariable类型:" + type);
			} else if (type instanceof Class) { //
				System.out.println("Class类型:" + type);
			}
		}
		/*
		 * 方法有2个参数,第一个参数list为ParameterizedType,实际参数为T,
		 * 第二个参数为GenericArrayType泛型数组类型T[],数组元素类型为T
		 */

		// 方法参数——注解 第一个参数使用了注解
		Annotation[][] parameterAnnotations = constructor.getParameterAnnotations();
		Annotation myAnnotation = parameterAnnotations[0][0];
		// 打印 @reflect.MyAnnotation(intValue=0)
		
		// 6、方法抛出的异常
		Class<?>[] exceptionTypes = constructor.getExceptionTypes();
		// 打印 [class java.lang.RuntimeException, class java.lang.Exception]
		Type[] genericExceptionTypes = constructor.getGenericExceptionTypes();
		// 打印 [class java.lang.RuntimeException, class java.lang.Exception]
	}
}
以上就是Constructor的所有信息,实际开发中,Constructor最重要的作用还是用来构造实例。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值