能够分析能力的程序成为反射,通俗的来讲就是能够通过运行时的类名获取类的全部信息。反射机制可以用来干以下的事情:

1、在运行时分析类的能力

2、在运行时查看对象,例如,编写一个toString()方法供所有类使用

3、实现通用的数组操作代码

4、利用Method对象,这个对象很像C++中的函数指针

下面来说一说他的底层实现原理:

在程序运行期间,JVM始终对所有的对象都有跟踪,并且将其所有信息存入一个类型为Class的对象中,选择对应的方法进行执行,即在程序运行时自动分析需要使用的类,并且通过newInstance()的方法动态的加载类。

反射的应用:

先看一下如下例子:

在没有使用反射时,每次增加一个水果都需要修改Factory中的代码,这样会很麻烦的

interface fruit{  public abstract void eat();
}  class Apple implements fruit{  public void eat(){  System.out.println("Apple");  }
}  class Orange implements fruit{  public void eat(){  System.out.println("Orange");  }
}  // 构造工厂类
// 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了
class Factory{  public static fruit getInstance(String fruitName){  fruit f=null;  if("Apple".equals(fruitName)){  f=new Apple();  }  if("Orange".equals(fruitName)){  f=new Orange();  }  return f;  }
}
class hello{  public static void main(String[] a){  fruit f=Factory.getInstance("Orange");  f.eat();  }  }  

使用反射:

interface fruit{  public abstract void eat();
}  class Apple implements fruit{  public void eat(){  System.out.println("Apple");  }
}  class Orange implements fruit{  public void eat(){  System.out.println("Orange");  }
}  class Factory{  public static fruit getInstance(String ClassName){  fruit f=null;  try{  f=(fruit)Class.forName(ClassName).newInstance();  //forName使用反射获取类,newInstance获取实例}catch (Exception e) {  e.printStackTrace();  }  return f;  }
}
class hello{  public static void main(String[] a){  fruit f=Factory.getInstance("Reflect.Apple");  if(f!=null){  f.eat();  }  }
}

这样一来,我们就不用在每一次增加水果种类时修改Factory类,由此可以看到反射的好处,那么问题来了,为什么不在任何地方都使用反射呢,这是因为,反射虽然节省了操作,但是他所占用的资源开销是很大的,因此我们要根据实际情况使用反射。

下面来说一下反射的具体使用方法:

java.lang.reflect包中有三个类Filed、Method、Constructor分别用于描述类的域、方法、构造器。这三个类都有一个getName()的方法,用来返回项目的名称。此外三个类中都有一个getModifiers()方法,用来分析访问修饰符使用情况。

获得构造函数的方法 
    Constructor getConstructor(Class[] params)//根据指定参数获得public构造器

Constructor[] getConstructors()//获得public的所有构造器

Constructor getDeclaredConstructor(Class[] params)//根据指定参数获得public和非public的构造器

Constructor[] getDeclaredConstructors()//获得public的所有构造器

获得类方法的方法 
    Method getMethod(String name, Class[] params),根据方法名,参数类型获得方法

Method[] getMethods()//获得所有的public方法

Method getDeclaredMethod(String name, Class[] params)//根据方法名和参数类型,获得public和非public的方法

Method[] getDeclaredMethods()//获得所以的public和非public方法

获得类中属性的方法 
    Field getField(String name)//根据变量名得到相应的public变量

Field[] getFields()//获得类中所以public的方法

Field getDeclaredField(String name)//根据方法名获得public和非public变量

Field[] getDeclaredFields()//获得类中所有的public和非public方法

示例如下:

package test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;public class Tresgt {public static void main(String args[]) {String name = "test.test121";
//          if(args.length>0)name=args[0];
//          else {
//              Scanner in =new Scanner(System.in);
//              System.out.println("Enter class name (e.g.java.until.Date):");
//              name=in.next();
//          }try {Class c1=Class.forName(name);Class superc1=c1.getSuperclass();System.out.println("----------------------"+c1.getModifiers());String modifiers=Modifier.toString(c1.getModifiers());if(modifiers.length()>0)System.out.println(modifiers+"");System.out.println("class:"+name);if(superc1!=null&&superc1!=Object.class)System.out.println("extends"+superc1.getName());System.out.println("\n{\n");System.out.println("------------------------------------");printConstructors(c1);System.out.println();System.out.println("------------------------------------");printMethods(c1);System.out.println();System.out.println("------------------------------------");printFields(c1);System.out.println("}");}catch(ClassNotFoundException e) {e.printStackTrace();}System.exit(0);}public static void printConstructors(Class c1){Constructor[] contructors = c1.getConstructors();for(Constructor c : contructors){String name = c.getName();System.out.print(" ");String m = Modifier.toString(c.getModifiers());if(m.length() > 0)System.out.print(m+" ");System.out.print(name + "(");Class[] p = c.getParameterTypes();for(int j = 0 ; j < p.length;j++){if(j> 0)System.out.print(", ");System.out.print(p[j].getName());}System.out.println(");");}}public static void printFields(Class c1) {Field[] fields = c1.getFields();for(Field f:fields) {Class type =f.getType();String name= f.getName();System.out.print("");String modifiers=Modifier.toString(f.getModifiers());if(modifiers.length()>0)System.out.print(modifiers+"");System.out.println(type.getName()+""+name+";");}}public static void printMethods(Class cl){Method[] methods = cl.getMethods();for(Method m : methods){Class retType = m.getReturnType();String name = m.getName();System.out.println(" ==========--------  ");String modifiers = Modifier.toString(m.getModifiers());if(modifiers.length() > 0){System.out.println(modifiers+"");}System.out.print(retType.getName()+" "+name+"(");Class[] paramTypes=m.getParameterTypes();for(int j=0;j<paramTypes.length;j++){if(j>0){System.out.println(",");}System.out.println(paramTypes[j].getName());}System.out.println(");");}}}

结果:

JAVA中反射是什么?相关推荐

  1. Java中反射的三种常用方式

    Java中反射的三种常用方式 package com.xiaohao.test; public class Test{ public static void main(String[] args) t ...

  2. 请说明一下JAVA中反射的实现过程和作用分别是什么?

    请说明一下JAVA中反射的实现过程和作用分别是什么? Java语言编译后形成.class文件,反射就是通过字节码文件找到一个类,类中的方法及属性等.反射的实现主要通过四个类 Class 类的对象 Co ...

  3. Java中反射的实现方式

    Java中的发射机制 所谓反射,是指在运行时状态中,获取类中的属性和方法,以及调用其中的方法的一种机制.这种机制的作用在于获取运行时才知道的类(Class)及其中的属性(Field).方法(Metho ...

  4. JAVA中反射的实现过程和作用分别是什么?

    JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类.类中的方法以及属性等.反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Fi ...

  5. java中反射机制的含义_java的反射是什么意思?

    反射是Java的特征之一,是一种间接操作目标对象的机制. Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象,都能够调用它的任意一个属 ...

  6. Java中反射相关的类

    目录 反射 反射相关的类 1. Class类--反射核心类 2. Constructor类--通过反射调用构造方法 破坏封装对象 3. Method类--通过反射调用普通方法 4. Field类--通 ...

  7. java中反射到底是什么_JAVA中反射是什么

    烧仙草VB JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息.首先我们先明确两个概念,静态编译和动态编译. ...

  8. Java中反射机制(Reflection)学习

    Java语言的反射机制初步学习 首先看下基本概念: (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任 意一个方法?答案是肯定的.这种动态获 ...

  9. Java中反射主要应用在哪里_Java学习:反射的应用场景和解析方法

    提到java语言的高级特性,反射绝对是Top1级别的,在大量开源框架中的应用范例比比皆是,那么需要了解清楚反射到底是什么?为什么要使用反射?如何使用反射?(what,why,how) 什么是反射? 正 ...

  10. java 中反射的使用_java中反射的基本使用

    fanShe.java package example5; class fanShe{ /*1.应用在一些通用性比较高的代码中. *2.后面学的框架,大多数都是应用框架来实现的. *3.在框架开发中, ...

最新文章

  1. [VSCode]中英文界面切换
  2. Dockerfile中npm中Error: could not get uid/gid问题的解决方法
  3. 在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件
  4. MongoDB 4.2 新特性解读
  5. InnoDB原理篇:如何用好索引
  6. 《Linux设备驱动开发详解》学习笔记一
  7. 有木有使用tomcat 7.0 报Out of Memory的同志
  8. 梯度下降的线性回归用python_一元线性回归和梯度下降的python代码实现
  9. 【嵌入式】课程文章参考
  10. springboot-增加自定义资源映射
  11. System Center 2016组件将发生什么变化?
  12. 国军标GJB 151B-2013军用设备和分系统电磁发射和敏感度要求与测量(海军10项)
  13. 木马开发的基本理论基础(四)
  14. Java图像识别技术:Test4J
  15. mysql数据库首次查询缓慢
  16. 把色*版 “微信” 的底裤都给挖出来了,网友: 草率了。。。
  17. 04_Python简答题
  18. no input file specified 解决方法
  19. Linux之音视频入门
  20. 《计算机组成原理》课程学习(7)——第3篇 中央处理器——第7章 指令系统

热门文章

  1. VS2015默认不支持x64下__asm{}内联汇编的解决方案(含资源共享)
  2. 科研—画图图片处理1
  3. 黑马程序员——JavaSE之集合框架总结二
  4. 介绍一种Android 平台 不需要获取imei imsi 无权限就能获取手机运营商的方法
  5. 汽车软件大战一触即发,诚迈科技如何重构整车“软架构”
  6. char类型和varchar的区别和选用
  7. 2021github仓库操作流程手册指南
  8. julia的Unicode 字符输入
  9. Photoshop如何切图
  10. 小熊派移植华为 LiteOS-M(基于MDK)