什么是反射?
反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。
通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。
也许你看完java反射的解释之后还是一头雾水,不要急,我们通过一个实例来让你了解java反射的作用,实践才是检验真理的唯一标准。
首先我们需要知道java反射大部分是需要Class这个类来完成,这里我给出经常使用的Class的方法,想了解更多的可以去查看jdk Api。
通过类的全限定名来获取类的信息,还原该类的字段和方法等声明和定义。
测试需要的类
package com.zhu.test;
class Animal{
}
interface A{
}
interface B{
}
public class Dog extends Animal implements A,B{
private String name;
private int age;
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 static void main(String[] args) throws ClassNotFoundException {
StringBuffer sb=new StringBuffer();
//-------------------获取类信息------------------------------------------
Class c=Class.forName("com.zhu.test.Dog");
//通过Modifier的toString方法获取类的修饰符
String modifier=Modifier.toString(c.getModifiers());
sb.append(modifier+" class");
sb.append(" "+c.getSimpleName());
//获取该类继承的类
Class superClass=c.getSuperclass();
c.getGenericSuperclass();
//判断该类是否有父类(除了Object)
if(!superClass.getSimpleName().equals("Object")){
sb.append(" extends "+superClass.getSimpleName());
}
//获取该类实现的接口
Class[] interfaces=c.getInterfaces();
if(interfaces!=null){
sb.append(" implements ");
for(int i=0;i<interfaces.length;i++){
Class cl=interfaces[i];
sb.append( cl.getSimpleName());
if(i!=interfaces.length-1){
sb.append(",");
}
}
}
sb.append("{\n");
//-------------------获取字段信息------------------------------------------
Field[] fields=c.getDeclaredFields();
for(Field field:fields){
String s=Modifier.toString(field.getModifiers());
sb.append(s);
sb.append(" ");
String fieldType=field.getType().getSimpleName();
sb.append(fieldType);
sb.append(" ");
String fieldName=field.getName();
sb.append(fieldName);
sb.append("\n");
}
//-------------------获取方法信息------------------------------------------
Method [] methods=c.getDeclaredMethods();
for(Method m:methods){
//获取方法修饰符
String methodModifier=Modifier.toString(m.getModifiers());
sb.append(methodModifier);
sb.append(" ");
//获取方法返回值
String returnType=m.getReturnType().getSimpleName();
sb.append(returnType);
sb.append(" ");
sb.append(m.getName());
sb.append("(");
//获取方法参数信息
Class[]params=m.getParameterTypes();
for(int i=0;i<params.length;i++){
Class clas=params[i];
sb.append(clas.getSimpleName());
sb.append(" ");
sb.append("arg"+i);
if(i!=params.length-1){
sb.append(",");
}
}
sb.append(");");
sb.append("\n");
}
sb.append("}");
System.out.println(sb.toString());
}
输出结果
由此可看出java反射的强大。