反射的概念:
主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
Java反射的功能
1)可以判断运行时对象所属的类
2)可以判断运行时对象所具有的成员变量和方法
3)通过反射甚至可以调用到private的方法
4)生成动态代理
编写Java反射程序的步骤:
1)必须首先获取一个类的Class对象
例如:
Class c1 = Test.class;
Class c2 = Class.forName(“com.reflection.Test”);
Class c3 = new Test().getClass();
2)然后分别调用Class对象中的方法来获取一个类的属性/方法/构造方法的结构
注意:如果要能够正常的获取类中方法/属性/构造方法应该重点掌握如下的反射类
Field
Constructor
Method
获取指定的包名
String package02 = c2.getPackage().getName();
获取类的修饰符
int mod = c1.getModifiers();
String modifier = Modifier.toString(mod);
获取指定类的父类
Class superClazz = c1.getSuperclass();
String superClazzName = superClazz.getName();
//获取实现的接口
Class[] interfaces = c1.getInterfaces();
获取指定类的成员变量
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
modifier = Modifier.toString(field.getModifiers()); //获取每个
字段的访问修饰符
Class type = field.getType(); //获取字段的数据类型所对应的
Class对象
String name = field.getName(); //获取字段名
if (type.isArray()) { //如果是数组类型则需要特别处理
String arrType = type.getComponentType().getName() +
"[]";
System.out.println("" + modifier + " " + arrType + " "
+ name + ";");
} else {
System.out.println("" + modifier + " " + type + " " +
name + ";");
}
}
获取类的构造方法
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
String name = constructor.getName(); //构造方法名
modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符
System.out.println("" + modifier +" " + name + "(");
Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数
for (int i = 0; i < paramTypes.length; i++) {
if (i > 0) {
System.out.print(",");
}
if (paramTypes[i].isArray()) {
System.out.println(paramTypes
[i].getComponentType().getName()+"[]");
} else {
System.out.print(paramTypes[i].getName());
}
}
System.out.println(");");
}
获取成员方法
Method[] methods = c1.getDeclaredMethods();
for (Method method: methods) {
modifier = Modifier.toString(method.getModifiers());
Class returnType = method.getReturnType(); //获取方法的返回类型
if (returnType.isArray()) {
String arrType = returnType.getComponentType
().getName()+"[]";
System.out.print(""+modifier+" " + arrType + " " +
method.getName() + "(");
} else {
System.out.print("" + modifier + " " +
returnType.getName() + " " + method.getName() + "(");
}
Class[] paramTypes = method.getParameterTypes();
for (int i = 0; i < paramTypes.length; i++) {
if (i > 0) {
System.out.print(",");
}
if (paramTypes[i].isArray()) {
System.out.println(paramTypes
[i].getComponentType().getName()+"[]");
} else {
System.out.print(paramTypes[i].getName());
}
}
System.out.println(");");
}
}