JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
一般情况下,如果我们要调用一个对象的方法或者属性,程序员需要先获得这个对象有哪些方法或者属性;反射就是程序员不需要提前知道有哪些属性或者方法,可以由程序自己查询和判断调用哪一个属性或者方法。
简而言之,反射是被动获取信息的一种方式。
具体用法如下:
1 创建一个学生类Student
public class Student {
public String name;
public String tell;
public String address;
private char sex;
public void eat(){
System.out.println(name+"----------"+"吃苹果");
}
public Student() {
super();
}
public Student(String name, String tell, String address, char sex) {
super();
this.name = name;
this.tell = tell;
this.address = address;
this.sex = sex;
}
public void show(String name,String tell,String address){
System.out.println(name+"---"+tell+"---"+address);
}
}
2 在main方法中调用该类
public static void main(String[] args) {
Class clazz = Student.class;
//获取所有的属性(包括私有)
Field[] fds = clazz.getDeclaredFields();
for(Field f:fds){
System.out.println(f.getName());
System.out.println(f.getModifiers());
System.out.println("------------------");
}
System.out.println("==================");
//获取所有的方法
Method[] method = clazz.getDeclaredMethods();
for(Method m:method){
System.out.println(m.getName());
System.out.println(m.getReturnType());
System.out.println(m.getModifiers());
System.out.println(m.getParameterCount());
Class[] c = m.getParameterTypes();
for(int i=0;i<m.getParameterCount();i++){
System.out.println(c[i]);
}
System.out.println("-----------------------");
}
System.out.println("===========================");
try {
Field field = clazz.getField("name");
System.out.println(field.getModifiers());
Method m = clazz.getMethod("eat");
Object obj = clazz.newInstance();
field.set(obj, "XXXXX");
m.invoke(obj);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException 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 e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
另外一种加载该类的方法如下
public static void main( String[] args )
{
try {
Class clazz = Class.forName("reflect.Student");
//获取当前类的所有公有属性
Field[] field = clazz.getFields();
for(Field f:field){
System.out.println(f.getName());//属性名
System.out.println(f.getModifiers());//属性修饰符 1:公有 2:私有
System.out.println(f.getType());//属性类型
System.out.println("--------------------");
}
System.out.println("==========================");
//获取所有的公有方法
Method[] methods = clazz.getMethods();
for(Method m:methods){
System.out.println(m.getName());//方法名
System.out.println(m.getReturnType());//方法返回类型
System.out.println(m.getParameterCount());//方法参数个数
System.out.println("-----------------------");
}
System.out.println("===========================");
//获取所有的构造方法
Constructor[] cttrs = clazz.getConstructors();
for(Constructor cttr:cttrs){
System.out.println(cttr.getName());//构造方法名
System.out.println(cttr.getParameterCount());//构造方法参数个数
Class[] c = cttr.getParameterTypes();//参数类型
for(int i=0;i<cttr.getParameterCount();i++){
System.out.println(c[i]);
}
System.out.println("----------------");
}
System.out.println("==========================");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}