Java反射 Constructor类
Java通过反射可以获取构造方法,和使用构造方法创造对象。
在网上找了一个比较好理解的例子来弄清楚Constructor类。
public Constructor getConstructor()// 公共构造方法对象
public Constructor[] getConstructors()//所有公共构造方法对象
public Constructor[] getDeclaredConstructors()//所有构造方法对象
public Constructor getDeclaredConstructor()//获取私有构造方法对象
public Constructor<T> getConstructor(Class<?>... parameterTypes)// 参数表示的是:你要获取的构造方法的构造参数个数及数据类型的class字节码文件对象
public void setAccessible(boolean flag)// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。 暴力访问
package fieldtest;public class Student {// 成员变量public String name;// 公共private int age;// 私有// 构造方法public Student() {super();// TODO Auto-generated constructor stub}// 私有构造方法private Student(String name) {this.name = name;}public Student(String name, int age) {super();this.name = name;this.age = age;}// 成员方法(getXxx/setXxx)public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 成员方法public void study() {System.out.println("我爱学习java!");}// 私有private void study(String string) {System.out.println("我还爱学习" + string);}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}
import java.lang.reflect.Constructor;public class ConstructorDemo {public static void main(String[] args) throws Exception {// 获取字节码文件对象Class c = Class.forName("fieldtest.Student");// 获取所有构造方法Constructor[] cons = c.getDeclaredConstructors();for (Constructor con : cons) {System.out.println(con);}// 获取单个构造方法Constructor con = c.getConstructor();// 返回的是构造方法对象Constructor con1 = c.getConstructor(String.class, int.class);// 返回的是有参构造方法对象Constructor con2 = c.getDeclaredConstructor(String.class);// 创建对象Object obj = con.newInstance();//使用无参构造方法创建对象Object obj1 = con1.newInstance("x", 1);// 暴力访问con2.setAccessible(true);// 值为true则指示反射的对象在使用时应该取消Java语言访问检查。Object obj2 = con2.newInstance("y");System.out.println(obj.toString());System.out.println(obj1.toString());System.out.println(obj2.toString());}
}/*输出:
public fieldtest.Student(java.lang.String,int)
private fieldtest.Student(java.lang.String)
public fieldtest.Student()
Student [name=null, age=0]
Student [name=x, age=1]
Student [name=y, age=0]*/
通过例子可以总结:
使用反射机制创建对象步骤:
-
获得指定类的Class类对象。
Class c = Class.forName("fieldtest.Student");
-
通过反射获取指定参数类型的Constructor类对象。
Constructor con1 = c.getConstructor(String.class, int.class);
-
调Constructor类对象的newInstance()方法传入对应参数值,创建对象。
Object obj1 = con1.newInstance("x", 1);
例子2:
import java.lang.reflect.*;
public class ClassObj {public static void main(String[] args) {try {Class c5 = Class.forName("java.lang.Integer");//在类中首先获得指定类的Class类对象Constructor construct = c5.getConstructor(int.class);//通过Class类对象的getConstructor获得指定符合参数类型的构造方法。Integer in = (Integer) construct.newInstance(1234);//通过constructor类对象的newInstance()方法传入参数,创建对象in。System.out.println(in.toString());}catch(Exception e) {e.printStackTrace();}}
}
//输出:1234
/*
Integer的toString()源码:private final int value;public Integer(int value) {this.value = value;
}
public String toString() {return toString(value);
}
*/
一些例子代码参考自https://www.jb51.net/article/171123.htm