反射 操作构造方法

反射是一种新的创建对象、操作属性和方法的技术。

一共是三种:操作构造方法、操作方法和操作属性;这篇博客仅讨论构造方法。

下面是我们这篇博客所需要的类:

public class Student {

	public String name;
	
	public Student() {

	}
	
	public Student(String name) {
		this.name = name;
	}
	
	Student(int age){
		
	}
	
	public void doHomework() {
		System.out.println(name+"正在做作业。。。。。。");
	}	
}

获取构造方法:           注意: 构造方法对应的class类为Constructor类

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectTest {
	public static void main(String[] args) {
	
		Class clazz = Student.class;
		try {
			
			//1、仅获取public修饰的构造方法对应的Constructor对象
			Constructor constructor = clazz.getConstructor();
			System.out.println(constructor.getName());
			
			Constructor [] constructors = clazz.getConstructors();
			System.out.println(constructors.length);
			
			constructor = clazz.getConstructor(String.class);
			System.out.println(constructor.getName());
			
			//2、不区分访问权限获取构造方法对应的Constructor对象
			constructor = clazz.getDeclaredConstructor();
			System.out.println(constructor.getName());
			
			constructors = clazz.getDeclaredConstructors();
			System.out.println(constructors.length);
			
			constructor = clazz.getDeclaredConstructor(String.class);
			System.out.println(constructor.getName());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

注意:

  • Constructor[] getConstrutors():返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。
  • Constructor getConstrutor(Class<?>... parameterTypes):返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。
  • Constructor<?>[] getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
  • Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。

输出的信息如下:

查看构造方法信息:

import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class ConstructionTest {

	public static void main(String[] args) {
		
		Class clazz = Student.class;
		
		//查看构造方法
		try {
			
			Constructor constructor = clazz.getConstructor(String.class);
			
			//获取声明Constructor对象对应构造方法的类的class对象
			clazz = constructor.getDeclaringClass();
			System.out.println(clazz);
			
			//以整数形式返回Constructor对象表示的构造方法的修饰符
			int mod = constructor.getModifiers();
			String result = Modifier.toString(mod);
			System.out.println(result);
			
			//获取构造方法名
			result = constructor.getName();
			System.out.println(result);
			
			//获取参数列表
			Class [] types = constructor.getParameterTypes();
			System.out.println(types.length);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注意:

  • Class<T> getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
  • int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
  • String getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
  • Class<?>[] getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0
  • getConstructors()getConstructor(Class<?>... parameterTypes)方法均无法获取public类中默认无参构造方法对应的Constructor对象。
  • getDeclaredConstructors()getDeclaredConstructor(Class<?>... parameterTypes)方法可以获取public类中默认无参构造方法对应的Constructor对象。 

显示信息如下:

调用构造方法:

import java.lang.reflect.Constructor;

public class ConstructionTest {

	public static void main(String[] args) {
		
		Class clazz = Student.class;
		
		//调用构造方法
		try {
			Constructor constructor = clazz.getDeclaredConstructor(String.class);
			constructor.setAccessible(true);
			Student student = (Student) constructor.newInstance("Tom");
			System.out.println(student.name);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注意:

  • void setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
  • T newInstance(Object... initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。

显示信息如下:

发布了99 篇原创文章 · 获赞 3 · 访问量 1230

猜你喜欢

转载自blog.csdn.net/qq_44971038/article/details/103877886
今日推荐