通过一个实例让你快速学习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;
}
}
输出结果
由此可看出java反射的强大。
反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到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反射代码--01.通过类名称加载一个类并且获取当前类实例
- Java反射之通过反射获取一个对象的方法信息(实例代码)
- 通过实例学习 NetBeans 6 的新功能 第 2 部分:Java 桌面应用程序
- 通过Java反射调用方法的实例,通过这个例子,能明白怎么用反射。
- Java 编程下通过反射获取一个类中的方法名和对应参数名
- 通过反射构造一个类的实例
- (Java2D 学习笔记系列) (一)一个简单的图像填充实例及其分析理解
- C#基础:通过一个实例来学习IFormattable接口,扩展方法
- 关于Java反射机制的一个实例
- 在Java中如何通过反射找到一个变量,这个变量的类型是指定的类型
- java通过模板导出excel的一个实例
- 通过一个实例,讲解java 中的类、方法和字段
- java struts2入门学习实例--使用struts2快速实现上传
- 原名是:如何快速成为JAVA高手。照做了不一定能成为高手但我觉得是一个很不错的JAVA学习流程
- [学习笔记]Java代码构建一个线程池的自己学习写的实例,用这个你会更好的理解文章内容
- 通过Java的反射机制来Copy一个对象
- java struts2入门学习实例--使用struts2快速实现多个文件上传
- 通过一个例子学习java的参数传递
- java通过暴力反射创建不可实例化类的对象实例
- (源码实例)通过层DIV实现,当鼠标放在链接上面,显示图片及文字 - 流星絮语 JAVA学习笔记 - CSDNBlog