美文网首页
反射机制的理解

反射机制的理解

作者: alpacino_1010 | 来源:发表于2019-05-25 10:01 被阅读0次

Reflection 是 Java 程序开发语言的重要特征之一,是学习Java必须知识点。

Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架

Java.lang.Class和Java.lang.reflect包下的API,用于表示或者处理当前JVM中的类,接口和对象。

Java反射的主要功能:

确定一个对象的类
取出类的modifiers,数据成员,方法,构造器,和超类.
找出某个接口里定义的常量和方法说明.
创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
在运行时刻调用动态对象的方法.
创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

Class类是Java反射的基础,Class类表示正在运行的java应用程序中的类和接口。Class只有私有的构造函数。Class类在加载类时由Java虚拟机以及调用类加载器中的 defineClass方法自动创建的。只在内存中存在一份加载类的Class类。
三种方式得到某个Java类的Class类,以java.lang.String为例:

  1. String s = "aaa";
  2. Class cls1 = s.getClass();
  3. Class cls2 = String.class;
  4. Class cls3 = Class.forName("java.lang.String");
  5. if (cls1 == cls2) {
  6. System.out.println("cls1 == cls2");
  7. }
  8. if (cls2 == cls3) {
  9. System.out.println("cls2 == cls3");
  10. }

为什么他们三个会==呢?因为他们描述的都是同一个类java.lang.String类。

Class类还有很多方法,配合java.lang.reflect包下的一些API可以实现更多的功能。

一个javabean

  1. package org.legend.reflect;

  2. public class UserInfo {

  3. private String userName;

  4. private Integer age;

  5. public String school;

  6. public UserInfo() {

  7. }

  8. public UserInfo(String name, Integer age, String shool) {

  9. this.userName = name;

  10. this.age = age;

  11. this.school = shool;

  12. }

  13. public UserInfo(String name, Integer age) {

  14. this.userName = name;

  15. this.age = age;

  16. }

  17. public String getInfo(String n, Integer i) {

  18. return "success" + n + i;

  19. }

  20. public void getMyInfo(String mName, String mBirth, Integer age) {

  21. System.out.println("我是一个来自" + mBirth + "的名叫:" + mName + "的" + age

    • "岁的选手");
  22. }

  23. public Integer getAge() {

  24. return age;

  25. }

  26. public void setAge(Integer age) {

  27. this.age = age;

  28. }

  29. public String getUserName() {

  30. return userName;

  31. }

  32. public void setUserName(String userName) {

  33. this.userName = userName;

  34. }

  35. }

一个操作类:

  1. package org.legend.reflect;

  2. import java.lang.reflect.Constructor;

  3. import java.lang.reflect.Field;

  4. import java.lang.reflect.InvocationTargetException;

  5. import java.lang.reflect.Method;

  6. import java.lang.reflect.Modifier;

  7. /**

    • 反射操作类
  8. */

  9. public class GetMyInfo {

  10. public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

  11. Class mclass = Class.forName("org.legend.reflect.UserInfo");

  12. System.out.println("------------输出类名-----------------------");

  13. System.out.println(mclass.getName());

  14. System.out.println(mclass.getSimpleName()); //基础类的简称

  15. //获取属性(字段)

  16. System.out.println("------------输出所有属性--------------------");

  17. Field[] fileds=mclass.getDeclaredFields(); //得到所有的字段,包括公共,保护,默认(包)和私有变量,但不包括继承的字段。

  18. //Field[] fileds = mclass.getFields(); //得到所有的公共字段。

  19. for(Field field:fileds)

  20. {

  21. String fieldName = field.getName(); //属性名称

  22. int fieldFangWen = field.getModifiers(); //属性访问权限修饰符

  23. Class fieldType = field.getType(); //属性类型

  24. System.out.println(Modifier.toString(fieldFangWen)+" "+fieldType.getSimpleName()+" "+fieldName);

  25. }

  26. //获取方法

  27. System.out.println("------------输出所有方法--------------------");

  28. Method [] methods=mclass.getDeclaredMethods();

  29. //Method[] medthods = mclass.getMethods();

  30. for(Method method:methods)

  31. {

  32. String methodName = method.getName(); //方法名称

  33. int methodFangWen = method.getModifiers(); //访问修饰符

  34. Class methodRetrunType = method.getReturnType();//返回类型

  35. Class [] methodParameter = method.getParameterTypes();//方法的参数列表

  36. System.out.print(Modifier.toString(methodFangWen)+" "+methodRetrunType.getSimpleName()+" "+methodName+"(");

  37. for(int k=0;k<methodParameter.length;k++)

  38. {

  39. String parameterName=methodParameter[k].getSimpleName();

  40. if(k!=methodParameter.length-1)

  41. {

  42. System.out.print(parameterName+" arg"+k+",");

  43. }

  44. else

  45. System.out.print(parameterName+" arg"+k);

  46. }

  47. System.out.println(");");

  48. }

  49. //获取构造

  50. System.out.println("------------输出所有构造器--------------------");

  51. Constructor[]constructors = mclass.getConstructors();

  52. for(Constructor constructor:constructors)

  53. {

  54. String constructorName = constructor.getName();

  55. Class[] constructorParameter = constructor.getParameterTypes();

  56. System.out.print(mclass.getSimpleName()+" "+constructorName.substring(constructorName.lastIndexOf(".")+1, constructorName.length())+"(");

  57. for(int h=0;h<constructorParameter.length;h++)

  58. {

  59. String parameterName = constructorParameter[h].getSimpleName();

  60. if(h!=constructorParameter.length-1)

  61. System.out.print(parameterName+" arg"+h+",");

  62. else

  63. System.out.print(parameterName+" arg"+h);

  64. }

  65. System.out.println(");");

  66. }

  67. //如何执行指定的方法

  68. System.out.println("------------反射执行方法--------------------");

  69. String name ="getMyInfo";

  70. Class[] parameterTypes = new Class[3];

  71. parameterTypes[0]= String.class;

  72. parameterTypes[1]= String.class;

  73. parameterTypes[2]= Integer.class;

  74. Method me = mclass.getDeclaredMethod(name, parameterTypes);

  75. Object obj = mclass.newInstance();

  76. Object[] arg = new Object[3];

  77. arg[0]="范晶晶";

  78. arg[1]="AAA风景区";

  79. arg[2]=new Integer(18);

  80. me.invoke(obj, arg);

  81. }

  82. }

反射的应用很多,很多框架都有用到

spring 的 ioc/di 也是反射....
javaBean和jsp之间调用也是反射....
struts的 FormBean 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) 也是反射....

反射还有一个不得不说的问题,就是性能问题,大量使用反射系统性能大打折扣。怎么使用使你的系统达到最优就看你系统架构和综合使用问题啦,这里就不多说了。。。

相关文章

  • 反射机制原理的深度理解2017-12-26

    首先我们编写person.java文件如下: 然后创建测试反射机制的类 原理解析: 要理解反射机制的实现过程,首先...

  • 反射机制的理解

    Reflection 是 Java 程序开发语言的重要特征之一,是学习Java必须知识点。 Java反射机制主要提...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • 反射的深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 ...

  • Android 反射机制的理解

    之前在网上找有关反射机制的资料发现网上关于这块的资料不多,而且不太容易懂,所以试着写一篇我自己所理解的反射机制希望...

  • Java反射机制

    导语 反射机制是Java程序开发语言的重要特征之一。 主要内容 认识反射 理解反射作用 利用反射来调用类的结构 具...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • java 的反射

    参考文档:深入理解Java类型信息(Class对象)与反射机制

  • java 反射

    java反射主要从以下几个方面理解 理解 Class 类 理解 Java 的类加载机制 学会使用 ClassLoa...

  • PHP反射机制Reflection

    反射机制简介 在面向对象编程中,对象被系统赋予了自省的能力,而实现这个自省的过程就是反射。 ​反射,简单理解就是根...

网友评论

      本文标题:反射机制的理解

      本文链接:https://www.haomeiwen.com/subject/mllazqtx.html