文章目录
1. Class 类与 Java 反射
1.1 访问构造方法
在通过下列一组方法访问构造方法时,将返回Constructor类型的对象或数组。每个Constructor对象代表一个构造方法,利用Constructor对象可以操纵相应的构造方法。
- getConstructors()
- getConstructor(Class<?>… parameterTypes)
- getDeclaredConstructors()
- getDeclaredConstructor(Class<?>… parameterTypes)
如果是访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。
先创建Example类:
public class Example {
public int id;
public String name;
private double price;
// 点击菜单栏中Source->Generate Constructor using Fields创建构造方法
public Example() {
super();
}
public Example(int id) {
super();
this.id = id;
}
private Example(int id, String name, double price) {
super();
this.id = id;
this.name = name;
this.price = price;
}
// 点击菜单栏中Source->Generate to String
@Override
public String toString() {
return "Example [id=" + id + ", name=" + name + ", price=" + price + "]";
}
}
然后创建Demo类:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
public class Demo {
public static void main(String[] args) {
try {
Class c = Class.forName("mr.Example");
Constructor cons[] = c.getDeclaredConstructors();// 获取所有构造方法
for (Constructor con : cons) {
System.out.print(Modifier.toString(con.getModifiers()) + " ");// 修饰符
System.out.print(con.getName() + "(");// 方法名
Class paras[] = con.getParameterTypes();// 方法的参数
for (int i = 0; i < paras.length; i++) {
System.out.print(paras[i].getSimpleName() + " args ");
if (i < paras.length - 1) {
// 如果不是最后一个,加个逗号
System.out.print(",");
}
}
System.out.println(") { }");
}
Constructor cs1 = c.getDeclaredConstructor();// 无参数构造方法
Object obj = cs1.newInstance();
System.out.println(obj.toString());
Constructor cs2 = c.getDeclaredConstructor(int.class);// 有参数构造方法
obj = cs2.newInstance(648);
System.out.println(obj.toString());
Constructor cs3 = c.getDeclaredConstructor(int.class, String.class, double.class);// 无参数构造方法
cs3.setAccessible(true);// 获取私有方法操作权限
obj = cs3.newInstance(1, "diamond", 648);
System.out.println(obj.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException</