您的位置:首页 > 编程语言 > Java开发

通过一个实例让你快速学习java反射

2017-09-16 13:37 387 查看
什么是反射?

反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到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反射的强大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java反射
相关文章推荐