一、什么是反射:
当程序运行的时候,允许改变程序结构或者变量类型,这种语言成为动态语言,但是java并不是动态语言,但是他有一个动态相关的机制,也就是反射。
二、方法的反射
有一个常用的方法,getName();
public class Test001 {
public static void main(String[] args) {
Class c1 = int.class;
Class c2 = String.class;
Class c3 = void.class;
System.out.println("c1.getName():"+c1.getName());
System.out.println("c2.getName():"+c2.getName());
System.out.println("c2.getSimpleName():"+c2.getSimpleName());
System.out.println("c3.getName():"+c3.getName());
}
}
上述运行结果:
c1.getName():int
c2.getName():java.lang.String
c2.getSimpleName():String
c3.getName():void
getName()方法可以打印该类类型的类名称,getSimpleName()方法可以打印不包含包名的类的名称。
案例:
import java.lang.reflect.Method;
public class Test002 {
public static void main(String[] args) {
//Test002 hqz = new Test002();
Object obj = new Object();
printClassMethodMessage((Object) obj);
}
public static void printClassMethodMessage(Object obj) {
Class c = obj.getClass();
System.out.println("类的名称" + c.getName());
Method[] ms = c.getMethods();
for (int i = 0; i < ms.length; i++) {
Class returnType = ms[i].getReturnType();
System.out.println(returnType.getName());
System.out.println(ms[i].getName() + "(");
Class[] paramType = ms[i].getParameterTypes();
for (Class class1 : paramType) {
System.out.println(class1.getName() + ",");
}
System.out.println(")");
}
}
}
案例运行结果:
类的名称java.lang.Object
void
wait(
)
void
wait(
long,
int,
)
void
wait(
long,
)
boolean
equals(
java.lang.Object,
)
java.lang.String
toString(
)
int
hashCode(
)
java.lang.Class
getClass(
)
void
notify(
)
void
notifyAll(
)
三、成员变量的反射:
成员变量同样也是对象,它是java.lang.reflect.Field类的方法,也就是说Field封装了关于成员变量的操作,下来就是获取成员变量的方法:
public static void printFieldMessage(Object obj) {
Class c = obj.getClass();
}
public static void printFieldMessage(Object obj) {
Class c = obj.getClass();
Field[] fs = c.getFields();
System.out.println(c.getFields().length);
for (int i = 0; i < fs.length; i++) {
System.out.println(i);
for (Field field : fs) {
Class fieldType = field.getType();
String typrName = fieldType.getName();
String fieldName = field.getName();
System.out.println(typrName + "-" + fieldName);
}
}
}
四、构造函数的反射
不管是方法的反射、成员变量的反射还是构造函数的反射,要想获取类的信息,我们首先需要获取类的类型。
public static void printConMessage(Object obj) {
/*
getConstructors()方法获取所有的public的构造函数
getDeclaredConstructors()方法得到所有的自己声明的构造函数
*/
Class c = obj.getClass();
Constructor [] cs = c.getDeclaredConstructors();
for(Constructor constructor : cs){
System.out.println(constructor.getName() + "(");
Class [] paramTypr = constructor.getParameterTypes();
for (Class class1 : paramTypr){
System.out.println(class1.getName());
}
System.out.println(")");
}
}