一、先看一看,百度百科给Java Reflection所下的定义
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
什么意思呢?可以简单理解为,通过类名,得到类中的方法和属性;用一个对象来获取它的方法和属性
二、反射用到的类
java.lang.Class,
java.lang.reflect.*
三、小试牛刀
//创建一个类,用于测试
package com.liu.bao;
public class Student {
private String name;
private int age;
private String address;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
1 获取类
//1、getClass()方法
Student student = new Student();
Class c1 = student.getClass();
//2、静态方法 forName()
Class c2 = Class.forName("com.liu.bao.Student");
//3、对于一个已定义的类型,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象
Class c3 = Student.class;
2 创建对象
Class class = Class.forName("com.liu.bao.Student");
Object o = class.newInstance();//调用无参构造方法,重写构造方法时,必需写一个无参构造
3 获取属性字段
Class c = Class.forName("com.liu.bao.Student");
Field[] fs = c.getDeclaredFields(); //获取所有的属性 (getFields()方法只能获得public属性)
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); // Modifier.toString(c.getModifiers()) 获取修饰符 c.getSimpleName()获取类名
for(Field field:fs){
sb.append("\t");//空格
sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
sb.append(field.getName()+";\n");//属性的名字+回车
}
sb.append("}");
System.out.println(sb);
//输出结果如下:
public class Student{
private String name;
private int age;
private String address;
}
4 获取构造方法
Class c = Class.forName("com.liu.bao.Student");
Constructor[] constructors = c.getConstructors();
for(Constructor constructor:constructors) {
System.out.println(constructor);
}
//输出结果如下:
public com.liugan.baojun.Student()
public com.liugan.baojun.Student(java.lang.String,int,java.lang.String)
5 获取方法
Class c = Class.forName("com.liu.bao.Student");
Method[] methods = c.getDeclaredMethods();
StringBuffer sb = new StringBuffer();
sb.append(Modifier.toString(c.getModifiers())+" "+"class"+ " " + c.getSimpleName()+"{\n");
for (int i = 0; i < methods.length; i++) {//外层循环,获取所有的方法
sb.append("\t"+Modifier.toString(methods[i].getModifiers())+" ");
sb.append(methods[i].getReturnType().getSimpleName()+" ");
sb.append(methods[i].getName()+"(");
Parameter[] parameters = methods[i].getParameters();
for (int j = 0; j < parameters.length; j++) {//内层循环,获取某方法所有参数类型
sb.append(parameters[j].getType().getSimpleName()+" "+"arg"+j);
if(j<parameters.length-1) {
sb.append(", ");
}
}
sb.append("){}\n");
}
sb.append("\n}");
System.out.println(sb);
//输出结果如下:
public class Student{
public String getAddress(){}
public String getName(){}
public void setName(String arg0){}
public int getAge(){}
public void setAge(int arg0){}
public void setAddress(String arg0){}
}