需求:通过反射来获取某一个类的构造器:
1):获取该类的字节码对象.
2):从该字节码对象中去找需要获取的构造器.
------------------------------------------------------------------------
Class类获取构造器方法:
Constructor类:表示类中构造器的类型,Constructor的实例就是某一个类中的某一个构造器
publicConstructor<?>[] getConstructors():该方法只能获取当前Class所表示类的public修饰的构造器
publicConstructor<?>[] getDeclaredConstructors():获取当前Class所表示类的所有的构造器,和访问权限无关
publicConstructor<T> getConstructor(Class<?>... parameterTypes):获取当前Class所表示类中指定的一个public的构造器
参数:parameterTypes表示:构造器参数的Class类型
如:public User(String name)
Constructor c = clz.getConstructor(String.class);
publicConstructor<T> getDeclaredConstructor(Class<?>...parameterTypes) :获取当前Class所表示类中指定的一个的构造
练习代码:
package com.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;
public class Main {
//获取指定的一个构造器
public Main(){
System.out.println("我是Main类无参的构造器");
}
private Main(String statement){
System.out.println("我是带有一个String类型的参数的构造器");
}
private Main(String str, int num){
System.out.println("我是带有两个参数的构造器");
}
private static void getAll(){
//1:获取构造器所在类的字节码对象
Class<Main> clz = Main.class;
//2:获取clz对象中所有的构造器
Constructor<?>[] cs = clz.getConstructors();
System.out.println(cs.length);
for (Constructor<?> c : cs) {
System.out.println(c);
}
cs = clz.getDeclaredConstructors();
System.out.println(cs.length);
for(Constructor<?> c : cs){
System.out.println(c);
}
}
private static void getOne() throws NoSuchMethodException, SecurityException{
//1:获取构造器所在类的字节码对象
Class<Main> clz = Main.class;
//2:获取clz对象中所有的构造器
//需求1:获取public Main()
Constructor<Main> con = clz.getConstructor();
System.out.println(con);
//需求2:获取public Main(String statement)
con = clz.getDeclaredConstructor(String.class);
System.out.println(con);
//需求3:获取private Main(String str, int num)
con = clz.getDeclaredConstructor(String.class, int.class);
System.out.println(con);
}
public static void main(String[] args) throws Exception {
System.out.println("---------类的实例------------------");
//需求1:获取java.util.Date类的字节码对象
//方式1:使用class属性
Class<java.util.Date> clz1 =java.util.Date.class;
//方式2:通过对象的getClass方法获取,getClass是Object类中的方法
java.util.Date date = new java.util.Date();
Class<?> clz2 = date.getClass();
//方式3:通过Class类中的静态方法foeName(String className)
Class<?> clz3 = Class.forName("java.util.Date");
System.out.println(clz1+"\n"+clz2+"\n"+clz3+"\n");
System.out.println("----------获取类的构造器-----------------");
getOne();
System.out.println("-----------获取类的所有的构造器----------------");
getAll();
}
}
OutPut:
---------类的实例------------------
class java.util.Date
class java.util.Date
class java.util.Date
----------获取类的构造器-----------------
public com.test.Main()
private com.test.Main(java.lang.String)
private com.test.Main(java.lang.String,int)
-----------获取类的所有的构造器----------------
1
public com.test.Main()
3
private com.test.Main(java.lang.String,int)
private com.test.Main(java.lang.String)
public com.test.Main()