JAVA学习心得——详述反射中的构造方法

 

获取构造方法必须借助于Class类的实例化对象,所以我们首先复习一下如何将class类对象实例化。

获取class类对象实例化的六种方法

  • 获取构造方法:

获取构造方法的方法有4种,虽然结构形式上很相似,但是也有不同之处,下面先将四种方法列上:

  • 方法一:实例化对象.getConstrutors():
  • 方法二:实例化对象.getConstrutor(Class... parameterTypes)
  • 方法三:实例化对象.getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
  • 方法四:实例化对象.getDeclaredConstructor(Class... parameterTypes)返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。
public class Student {
	public String name ;
	public Student() {		
	}
	public Student(String name) {
		this.name = name ;
	}
	public void dohomework(String name) {
		System.out.println(name+"正在做作业......");	
	}
}

方法一:返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。

public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getConstructor();//获取构造方法
			System.out.println(constructor.getName());//构造方法调用.getName,并输出。
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

方法二:返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象 

public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getConstructor(String.class);//此时获取的构造方法,是对应参数列表相匹配的构造方法。
			System.out.println(constructor.getName());//构造方法调用.getName,并输出。
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

方法三:返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。

public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getDeclaredConstructors();//此时获取的构造方法,无视访问权限,是对应参数列表相匹配的构造方法。

			System.out.println(constructor.getName());//构造方法调用.getName,并输出。
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

方法四:返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限)的Constructor对象。

public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getDeclaredConstructors(String.class);//此时获取的构造方法,无视访问权限,是对应参数列表相匹配的构造方法。
			System.out.println(constructor.getName());//构造方法调用.getName,并输出。
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

 获取构造方法信息:

  • .getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
  • int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
  • .getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
  • .getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0
public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getConstructor(String.class);//获取构造方法
			System.out.println(constructor.getDeclaringClass());//获取构造方法的类的class对象
			String result =Modifier.toString(constructor.getModifiers());//获取构造方法的修饰符
			System.out.println(result);
			System.out.println(constructor.getName());
			Class[] var =constructor.getParameterTypes();
			for (Class ss : var) {
				System.out.println(ss);//获取由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

输出结果如下: 

JAVA学习心得——详述反射中的构造方法_第1张图片

创建对象

 newInstance(Object... initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。

setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。

public class Test{
    public static void main(string[] args){
        Class clazz = Student.class;//
		try {
			Constructor constructor =clazz.getConstructor(String.class);
            constructor.setAccessible(true);//无视访问权限,通过Boolean来控制。
			Object object = constructor.newInstance("Jim");
			Student student = (Student)object;
			student.doHomework();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
}

输出如下结果.

 

 

 

 

 

 

你可能感兴趣的:(Java,java)