反射机制

来谈谈 Java 反射机制,动态代理是基于什么原理?

佐手、 提交于 2019-11-28 08:38:54
1 一些概念 首先我们来看一些概念性的描述: 注解(Annotation) :也叫元数据。一种代码级别的说明。它是JDK 1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 反射 :赋予程序在运行时自省(introspect)的能力。 指的是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。 动态代理 :是一种 方便运行时动态处理代理方法调用的机制 。很多场景都是利用类似机制,比如:用来包装RPC调用、面向切面编程(AOP) AOP :面向切面编程。在不影响原有功能的情况下,对程序进行横向扩展。说说我自己的理解吧。某个类的方法已经封装好了,现在我们要对原有的方法进行干预,但是又不能破坏原来的类,这时候就需要aop的思想,把这个切点扩展成一个面来进行操作。( 也就是生成该类的代理,对代理进行操作 ) 依赖注入(控制反转) :Spring是通过反射来实现依赖注入的。什么是依赖呢? 如果在A类里面调用B类,那么A类需要依赖于B类,通常的话,是A类来创建B类的示例。但是spring 里面,创建的动作由spring容器来完成,然在在运行的时候注入到A类中,所以叫做依赖注入。比如说注解@Resource和@Autowired等

《深入理解Java虚拟机》- JVM是如何实现反射的

六眼飞鱼酱① 提交于 2019-11-28 06:28:02
Java反射学问很深,这里就浅谈吧。如果涉及到方法内联,逃逸分析的话,我们就说说是什么就好了。有兴趣的可以去另外看看,我后面可能也会写一下。(因为我也不会呀~) 一、Java反射是什么? 反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。 反射是由类开始的,从class对象中,我们可以获得有关该类的全部成员的完整列表;可以找出该类的所有类型、类自身信息。 二、反射的一些应用 1、java集成开发环境,每当我们敲入点号时,IDE便会根据点号前的内容,动态展示可以访问的字段和方法。 2、java调试器,它能够在调试过程中枚举某一对象所有字段的值。 3、web开发中,我们经常接触到各种配置的通用框架。为保证框架的可扩展性,他往往借助java的反射机制。例如Spring框架的依赖反转(IOC)便是依赖于反射机制。 三、Java反射的实现 1. Java反射使用的api(列举部分,具体在rt.jar包的java.lang.reflect.*)中 列举Class.java中的一些方法。这些都很常用,比如在你尝试编写一个mvc框架的时候,就可以参照这个类里面的方法,再结合一些Servlet的api就实现一个简单的框架。 2.代码实现 2.1 代码实现的目的:说明反射调用是有两种方式,一种是本地实现,另一种是委派实现。

反射和XML

与世无争的帅哥 提交于 2019-11-28 06:23:54
反射和XML 回顾: 1 NIO简介 Java Non-blocking IO New IO 2 和传统IO (1) 面向流 ,面向缓冲区 (2) 阻塞, 非阻塞 (3) 无 选择器(selector) 3 NIO Buffer:ByteBuffer CharBuffer Channel:FileChannel、ServerSocketChannel 、SocketChannel Selector:选择器、轮询器 4 Buffer ByteBuffer CharBuffer ShortBuffer .... 重要属性 0<=mark<=postion<=limit<=capacity put();//放入数据 get();//获取数据 flip();//切换为读模式 rewind()//可以重复 mark();//做标记 reset();//返回上一个标记 clear()//清空, compact();//清空,会保留未读取的数据 间接缓冲区: 堆中,空间不大,速度慢,jvm可以回收 直接缓冲区: 物理内存(虚拟内存)中,空间大,速度块,jvm不能回收。 5 Channel FileChannel InputStream OutputStream RandomAcceFile的getChannle(); FileChannel.open(); ServerSocketChannel

java的反射机制使用方法

陌路散爱 提交于 2019-11-28 05:41:17
 什么是反射?   Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。 反射的三种方式: 方式一:利用对象获取类--------------不推荐(已经获取到对象,再用反射意义不大) public static void main(String[] args) { Person person = new Person(); Class<?> c = person.getClass(); System.out.println(c.getName()); } 方式二:利用类名获取类--------------不推荐(需要对象的包,依赖性太强) public static void main(String[] args) { Class<?> c = Person.class; System.out.println(c.getName()); } 方式三:利用类的全路径名获取-------------------推荐 本文主要就是讲述方式三,通过类的全路径名去获取并操作类中的方法,字段等: 实体类代码如下:----本文中主要就是获取并操作这个实体类中的字段和方法 package com.xnrd.common.base; public

Java 反射 (Class、ClassLoader、Constructor、Method、Field)

馋奶兔 提交于 2019-11-28 05:29:13
https://www.cnblogs.com/wanghang-learning/p/9142750.html 反射是Java中一个非常重要、非常强大的机制。曾看到一句话“反射是框架的灵魂”,初学时不懂,等到学完框架之后才慢慢理解其意。 什么是反射?我们先通过几个类和示例来初步体会一下反射 。 一、ClassLoader类 什么是类加载器? ClassLoader是一个抽象类,它的实例是类加载器。磁盘上存在的xxx.class文件需要被加载进JVM才能执行。类加载器则是负责加载.class文件的对象,然后在JVM中生成该类的Class对象。每一个Class对象都关联着定义它的那个类加载器。数组的类加载器与其元素的加载器是同一个,如果元素类型是基本类型,则数组没有类加载器。 类加载器工作原理 类加载器都有一个与之关联的父加载器,当加载器需要加载一个文件时,它首先将该任务”委派”给父加载器,如果父加载器无法加载该文件,再自己进行加载。JVM的引导加载器(bootstrap class loader)没有父加载器,但可作为父加载器。关于类加载器更详细的分析 点击这里 二、Class类 什么是Class<T>类? Class不是我们平常声明类时所用的关键字class,它是一个类,它的对象用来描述一个运行状态的类或接口。一个xxx.java文件编译后生成一个xxx.class文件

Java中的反射

旧城冷巷雨未停 提交于 2019-11-28 04:59:37
前言:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 来源: https://www.cnblogs.com/LBJLAKERS/p/11392622.html

Qt 反射,moc,Q_INVOKABLE

随声附和 提交于 2019-11-28 03:02:01
使用 Q_INVOKABLE 来修饰成员函数, 目的在于被修饰的成员函数能够被元对象系统所唤起 Q_INVOKABLE 与 QMetaObject::invokeMethod 均由元对象系统唤起。 这一机制在Qt C++/QML混合编程,跨线程编程,Qt Service Framework 以及 Qt/ HTML5混合编程以及里广泛使用。 一,Qt C++/QML混合编程 QML中调用C++方法借助了Qt元对象系统 。考虑在QML中使用Qt C++定义的方法,如下代码所示 mport Qt 4.7 import Shapes 5.0 //自定义模块 Item { width: 300; height: 200 Ellipse { x: 50; y: 35; width: 200; height: 100 color: "blue" MouseArea { anchors.fill: parent // 调用C++中定义的randomColor方法 onClicked: parent.color = parent.randomColor() } } } 为了让上述QML代码成功的调用下面这段代码定义的randomColor()函数,最为关键的一点见r andomColor方法用Q_INVOKABLE 修饰。 #include <QDeclarativeItem > class

详述反射中的构造方法

笑着哭i 提交于 2019-11-28 00:48:54
什么是反射? Java 反射( Reflection )是一种新的 操作 类中成员变量 、 构造方法 和 普通方法 的机制 。 为了实现对成员变量、构造方法和普通方法的操作,我们需要借助 Java 自身提供的 java.lang 包下的 Class 类和 java.lang.reflect 包下的反射 API 。 在上篇博客( 如何获取Class类对象 )中,已经介绍如何获取Class类对象,而Class类的实例化对象其实就是反射机制的实现入口,本篇博客将会详细介绍反射中的构造方法。 现有学生类如下(用于本篇博客的实例证明): public class Student { String name; Integer id; public Student() { } public Student(String name) { this.name=name; } private Student(Integer id) {//Integer为int类型的包装类 this.id=id; } public void sleep() { System.out.println(name+" go to sleep "); } public void say() { System.out.println("学号为:"+id); } } 使用反射获取构造方法的实例对象

python面向对象--反射机制

空扰寡人 提交于 2019-11-27 20:48:05
class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def sell_house(self): print("[%s] 正在卖房子"%self.name) def rent_house(self): print("[%s]正在租房子,傻逼才租呢?"%self.name) b1=Black("dream","北京海淀") print(hasattr(Black,"feture")) #b1.name--->b1__dict__["name"] # print(hasattr(b1,"name"))#b1.name # print(hasattr(b1,"sell_house")) # # # print(getattr(b1,"name")) # print(getattr(b1,"sell_house")) # # func=getattr(b1,"rent_house")#没有报错 # func() # # # print(getattr(b1,"rent_house11","没有这个属性")) # b1.sb=True # setattr(b1,"sb",True) # setattr(b1,"name","alex") setattr(b1,"func"

反射

你。 提交于 2019-11-27 19:02:16
一、什么是反射 Python反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。 Python的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Python增加其灵活性与动态性的一种机制。 二、反射的具体实现 python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。 class Person: def __init__(self,name,age): self.name = name self.age = age def speak(self): print("I am %,%d years old."%(self.name,self.age)) p = Person("lilong",20) # 在进行操作之后使用__dict__方法查看 # #### 查看类的字典 #### # print(Person.__dict__) # #### 检查是否含有成员 ####   # print(hasattr(p, "name")) # print