`

反射:动态与静态衍生的反射

阅读更多

                                            Reflection反射

 

=================================================================================

【概念】:

 1、Java反射的概念
  反射含义:可以获取正在运行的Java对象。
  2、Java反射的功能
  1)可以判断运行时对象所属的类
  2)可以判断运行时对象所具有的成员变量和方法
  3)通过反射甚至可以调用到private的方法
  4)生成动态代理
 =======================================================================================

【有什么用】:

            举一个简单的例子:

我们在eclipse新建一个类及其方法属性时,下面调用对象方法以及属性时,直接一个点,就会给我们列出它所有的类和方法,这就是利用了java的反射机制。对一个类的自审,

现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了 

【一个准女婿要见未婚妻家人的故事引出】:

譬如 A a=new A();

         a.put(2);

这个是在编译阶段完成对a类型的解析,对a是不是有put方法进行了判断,如果a对象没有put方法,则编译不通过。

可是有的时候我们需要在运行的时候动态地对一个对象的指定方法进行调用,我不想写的那么死,在编译的时候就写就好像小明想和小红家庭中的哪个人聊天都没有确定我怎么能直接把小明和小红爸爸绑在一起呢,让程序在运行时候更有主动性,更能变通和迎接外来挑战。这时候我想写一个通用函数,传入一个对象,可以是小红爸爸,小红妈妈,可以是小红,把这个对象属性名,属性值,都输出反映给小明知道,小明才知道怎么更好的跟小红家庭成员交谈,在了解了他们兴趣爱好之后。

 

反射含义:可以获取正在运行的Java对象。

=======================================================================================

【JDK支持】:

JDK1.5以后引入,JDK1.4以及以前版本不支持。

=======================================================================================

【怎么用】:

实现Java反射的类
  1)Class:它表示正在运行的Java应用程序中的类和接口
  2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限
  3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
  4)Method:提供关于类或接口中某个方法信息

【重点】:其中Class类很重要。官方解释一大串,然而看后并不懂什么鬼,对程序员最好的语言就是代码

转:疯狂java

 

 public static void test01() throws ClassNotFoundException {
  Class c1 = TestReflection.class;
  Class c2 = Class.forName("com.reflection.TestReflection");
  //获取指定的包名
  String package01 = c1.getPackage().getName();
  String package02 = c2.getPackage().getName();
  System.out.println("package01 = " + package01);
  System.out.println("package02 = " + package02);
  //获取类的修饰符
  int mod = c1.getModifiers();
  String modifier = Modifier.toString(mod);
  System.out.println("modifier = " + modifier);
  //获取指定类的完全限定名
  String className = c1.getName();
  System.out.println("className = " + className);
  //获取指定类的父类
  Class superClazz = c1.getSuperclass();
  String superClazzName = superClazz.getName();
  System.out.println("superClazzName = " + superClazzName);
  //获取实现的接口
  Class[] interfaces = c1.getInterfaces();
  for (Class t : interfaces) {
  System.out.println("interfacesName = " + t.getName());
  }
  //获取指定类的成员变量
  Field[] fields = c1.getDeclaredFields();
  for (Field field : fields) {
  modifier = Modifier.toString(field.getModifiers()); //获取每个
  字段的访问修饰符
  Class type = field.getType(); //获取字段的数据类型所对应的
  Class对象
  String name = field.getName(); //获取字段名
  if (type.isArray()) { //如果是数组类型则需要特别处理
  String arrType = type.getComponentType().getName() +
  "[]";
  System.out.println("" + modifier + " " + arrType + " "
  + name + ";");
  } else {
  System.out.println("" + modifier + " " + type + " " +
  name + ";");
  }
  }
  //获取类的构造方法
  Constructor[] constructors = c1.getDeclaredConstructors();
  for (Constructor constructor : constructors) {
  String name = constructor.getName(); //构造方法名
  modifier = Modifier.toString(constructor.getModifiers()); //获取访问修饰符
  System.out.println("" + modifier +" " + name + "(");
  Class[] paramTypes = constructor.getParameterTypes(); //获取构造方法中的参数
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }
  //获取成员方法
  Method[] methods = c1.getDeclaredMethods();
  for (Method method: methods) {
  modifier = Modifier.toString(method.getModifiers());
  Class returnType = method.getReturnType(); //获取方法的返回类型
  if (returnType.isArray()) {
  String arrType = returnType.getComponentType
  ().getName()+"[]";
  System.out.print(""+modifier+" " + arrType + " " +
  method.getName() + "(");
  } else {
  System.out.print("" + modifier + " " +
  returnType.getName() + " " + method.getName() + "(");
  }
  Class[] paramTypes = method.getParameterTypes();
  for (int i = 0; i < paramTypes.length; i++) {
  if (i > 0) {
  System.out.print(",");
  }
  if (paramTypes[i].isArray()) {
  System.out.println(paramTypes
  [i].getComponentType().getName()+"[]");
  } else {
  System.out.print(paramTypes[i].getName());
  }
  }
  System.out.println(");");
  }

 

 https://www.douban.com/note/306848299/

 

这个网址各种用法写的非常详细,大家可以去看一下。基本涵盖反射机制在代码中的方法实例

 

 

 

1
6
分享到:
评论

相关推荐

    java 利用反射获取内部类静态成员变量的值操作.docx

    3. **反射**:反射是在运行时检查类、接口、字段和方法等的能力,通常用于实现动态代理或需要动态加载类的场景。 #### 三、核心知识点 接下来,我们将通过一个具体的例子来演示如何使用Java反射获取内部类的静态...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。

    动态生成静态HTML

    1. **动态与静态页面的区别** - 动态页面:基于服务器端脚本(如ASP.NET、PHP等),根据用户请求实时生成内容,每次请求都会执行数据库查询和其他逻辑处理。 - 静态页面:预先生成并存储为HTML文件,直接由Web...

    linux静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    java r反射源代码

    使用反射处理内部类时,需要注意区分匿名内部类、静态内部类和非静态内部类。反射API允许我们获取内部类的Class对象,创建内部类实例,并访问或调用其成员。 2. 类的反射: 反射的核心是Class类,它代表了Java类的...

    AOP动态代理(反射机制)

    静态代理需要为每个目标类创建一个代理类,而动态代理则可以在运行时动态创建代理对象,减少了代码量,同时适应性更强,能够处理未知或新增的接口。 6. **代理模式的其他实现**:除了Java的动态代理,还有其他实现...

    Qt下使用C++调用静态库及动态库示例程序

    使用简单的程序展示了C++调用动态库和静态库的方法。 文件结构: exe:笔者部署可运行文件,因开发环境版本不同,可能存在无法直接使用的情况,两个部署文件(copy_ldd.sh及useLib1.sh)可以结合文章分享的(ubuntu下...

    动态页面生成静态页面实例

    在动态生成静态页面的场景下,可能包含与静态化相关的设置或路由规则。 `binRuntimeError.log`可能是运行时错误日志,它记录了程序执行过程中遇到的问题,有助于调试和优化静态化过程。 `hhftohtml.sln`和`...

    Android动态加载与反射机制的静态污点分析研究.pdf

    《Android动态加载与反射机制的静态污点分析研究》 在当前的Android安全领域,隐私泄露是一个至关重要的问题。其中,污点分析是检测隐私泄露的主要手段。静态污点分析因其高代码覆盖率和低假阴性率而在Android隐私...

    webservice的动态调用和静态调用

    相反,动态调用通常是在运行时通过反射或者其他方式(如SOAPHttpClient)来构建请求和解析响应。这种方式无需预先添加服务引用,可以在运行时动态获取服务的元数据,更加灵活。例如,使用System.ServiceModel....

    动态网站静态化的实现方法

    ### 动态网站静态化的实现方法 随着互联网技术的发展与用户需求的变化,网站设计与开发领域不断探索新的优化方案以提升用户体验与系统性能。其中,动态网站静态化是一种被广泛采用的技术手段,尤其是在Java EE环境...

    librdkafka 动态库 静态库

    3. **动态库与静态库**: - **动态库**(.dll文件):在程序运行时由操作系统加载,多个程序可以共享同一份库副本,节省内存。但是,动态库的缺失或版本不匹配可能导致运行时错误。 - **静态库**(.lib文件):在...

    反射:C ++ 14反射库

    6. 性能考虑:尽管反射通常与动态性相关联,但一个优秀的C++反射库会尽可能优化性能,避免运行时的开销过大,同时保持C++的静态类型安全。 在实际使用"Reflex"或其他C++14反射库时,开发人员需要注意以下几点: - ...

    ASP.NET动态页面静态化代码

    - **更新管理**:静态化后,需要考虑如何处理页面内容更新,确保静态文件与数据库内容同步。 - **缓存策略**:设置合适的缓存策略,避免频繁生成静态页面。 - **安全问题**:静态页面可能暴露敏感信息,确保不...

    动态库静态库测试依赖问题的demo

    本文将深入探讨动态库(Dynamic Library)和静态库(Static Library)的概念,以及它们在测试和依赖性方面的差异。我们将通过一个名为"lib_share_static"的示例来说明这些问题。 首先,我们来理解什么是动态库和...

    Android+反射+代理+静态代理+AspectJ

    【Android + 反射 + 代理 + 静态代理 + AspectJ】 面向切面编程(AOP)是一种编程范式,与面向对象编程(OOP)相对,它旨在将关注点分离,使得通用功能(如日志记录、事务管理等)可以从核心业务逻辑中解耦。AOP 的...

    Java静态代理和动态代理

    四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...

    java无法从静态上下文中引用非静态一些错误

    java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑

    动态页面静态化汇总--页面静态化方案

    在静态化过程中,URLRewrite可以将动态URL转换为伪静态格式,使得用户和搜索引擎看到的是看似静态的URL,而实际上这些请求仍被转发到动态处理程序。通过这种方式,可以提升用户体验,同时利于SEO优化。 4. **JSP+...

Global site tag (gtag.js) - Google Analytics