技术标签: java
1.机制
在运行状态(动态)中对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象都能够调用它的任意方法和属性
2.功能
1.在运行时获取任意一个对象修饰符,泛型,父类/实现的接口/注解等
2.运行时构造任意一个类的对象
3.运行时获取任意一个类所具有的构造方法,成员变量和方法
4.运行时访问任意一个对象的成员变量和方法
3.应用
(1)通过类的全名创建类实例来使用外部用户定义的类
(2)开发类浏览器和智能IDE
(3)在测试工具中检测类的内部结构
(4)在框架开发中用于实现配置信息的处理
1.class类
java.lang.Class是所有Reflection API的切入点,是所有反射操作的入口
对于每种类型的对象java虚拟机都会实例化一个不可变的java.lang.Class实例
每个对象都是引用或者原始类型
1.java.lang.Class.java类对象
2.java.lang.reflect.Constructor.java类的构造器对象
3.java.lang.reflect.Method.java类的方法对象
4.java.lang.reflect.Field.java类的属性对象 Field字段也即成员变量
一/获取Class实例的三种方法
1.对象.getClass()
2.类型名.class
3.ClassforName()(最常用)
二/获取类的成员
java.lang.reflect.Field.java类,一个Field提供类或接口中的一个成员变量的信息,可以动态访问
public Field getDeclaredField(String name)//根据名字获取类中定义的成员变量,不包括继承父类的成员
public Field[] getDeclaredFields()//获取类中声明的所有成员变量,返回Field[]类型,不含继承父类的成员
无Declared包含继承父类的成员
访问成员变量,成员方法和构造方法的方法
1.列出所有成员的方法
2.根据名字搜索特定成员的方法
3.获取类的成员方法
4.获取类的构造方法
5.调用成员方法
//使用反射调用对象的方法
//使用反射根据方法名,和参数类型、参数数量来获取具体某个方法
Method m=c.getDeclaredMethod(methodname, Class.forName(mptypes[0]));//String.class
//方法的调用,调用o对象的m方法,方法的实际参数是mp1,mo是方法调用的返回值
Object mo=m.invoke(o,mp1);
//o.setName("xiaohong");
System.out.println(mo);
//调用了o对象名为setAge,参数有1个,类型是int型的方法,实际参数是21
m=c.getDeclaredMethod("setAge", int.class);
m.invoke(o, 21);
System.out.println(o);
/*Method m=c.getDeclaredMethod(methodname);
Object mo=m.invoke(o);
System.out.println(mo);
System.out.println(f.get(o));*/
不得不用反射
第一个参数是调用方法的类实例
(静态方法)第一个参数为null
后面几个参数是该方法的参数
6.用反射的方式给对象的属性设置值,获取对象的属性值
//使用反射访问类对象的属性(给属性设置值,获取属性的值)
Field f=c.getDeclaredField(fieldname);//根据Field名,获得Field对象
f.setAccessible(true);
f.set(o,fvalue);//o.name=“xiaolin”;使用反射给o对象的f代表的属性设置值为发value的值
System.out.println(f.get(o));//获取o对象的f属性对应的值,并输出
1.给定类的实例
2.通常情况下是因为常规方法无法设置对象的属性值才迫不得已用反射
3.这方法违反了类的封装性的设计意图,耗费额外的系统开销
7通过Constructor实例创建对象
(1)关键字new
Object o=c.newInstance();//Student o=new Student();
(2)第二种用反射创建类对象的方法,先获取具体的Constructor,再用Constructor去创建对象
Constructor con=c.getDeclaredConstructor(String.class,int.class);
//根据构造方法参数类型来获取某个构造方法
Object o1=con.newInstance("Mary",20);
//用Constructor创建类对象,相当于Student o1=new Student("Mary",20);
System.out.println(o1);
//第一种用反射创建类对象的方法,相当于调用类的无参数构造方法
方法1调用非私有的无参构造,可以抛出构造方法的异常
方法2形参是(Object… obj)调用类的任何一个构造方法。用InnovationTargetException封装异常来抛出
1.反射增加了JVM的系统开销,
2.反射允许访问私有成员,打破了封装,可能破坏可移植性。
总结:能不用就不用
Class c=Class.forName(classname);
//根据类名字符串获得类对应的Class实例
包含继承父类成员
访问对象的属性(给属性设置值,获取属性的值)
//使用反射访问类对象的属性(给属性设置值,获取属性的值)
Field f=c.getDeclaredField(fieldname);//根据Field名,获得Field对象
f.setAccessible(true);
f.set(o,fvalue);//o.name="xiaolin";使用反射给o对象的f代表的属性设置值为fvalue的值
System.out.println(f.get(o));//获取o对象的f属性对应的值,并输出
用获取的类型来进行获取修饰符
这个是获取类声明所有的成员变量返回TypeVariable<?>接口类型
继承了多个接口
方法有getName()
getTypeParameters();
格式化成字符串后getName()
super父类
类型Class接口interfaces类型Type
getGeneritcinterfaces()c
ToString()获取类的注解类型Annotation
getAnnotation()
toString()
获取类的构造函数
Constructor返回类型
getDeclaredConstructor();
toGenericString()
获取类的成员变量
Field[]返回类型(成员变量类型)
getDeclaredFields();
ToGenericString();
Method[]返回类型
getMethods();
获取类的公有方法toGener
icString()
import java.lang.reflect.TypeVariable;
import java.lang.reflect.Modifier;
Modifier/TypeVariable要import才能使用
Class可以不用import
c.getModifiers()
%n这个参数必须是一个有符号整数的指针,它存储它出现之前打印的所有字符数。
.format(" ")格式化字符串
通过调用invoke方法来执行对象的某个方法
图片源于https://www.cnblogs.com/qingchen521/p/8575761.html
一个元数据形式,提供有关程序的数据,该数据不属于程序本身,注释对于对其注释的代码的操作没有直接影响
注解的语法
@注解类型名
用途:
1.编译前:为编译器提供编译检查的依据,辅助检查代码错误或抑制检查异常。
2.编译中或发布时:给编译器提供信息生成代码或给其他工具提供信息生成文档等。
3.运行时:在运行过程中提供信息给解释器,辅助程序执行。
注解经常和反射结合起来用,多用于框架中
五个基本注解
@Override
@Deprecated
@Suppress Warnings
@Safe Varargs
@FunctionalInterface
1.Override
位置:在方法前
作用:1.表示重写父类的方法
2.如果重写有错误就报错
可以强制子类必须覆盖父类的方法
[email protected]过时的警告
since属性指定从哪个版本开始,forRemoval指定该API将来会被删除
[email protected]
抑制编译器警告
4.SafeVarargs
堆异常警告
//给一个不带泛型的对象赋给一个带泛型的变量的时候往往就会发生堆污染
堆污染警告
faltyMethod发出"堆污染警告"
1.使用@SafeVarargs修饰引发该警告的方法或构造器
[email protected](“unchecked”)修饰
3.编译时用-Xlint:varags选项
函数式接口
@FunctionalInterface
如果接口中只有一个抽象方法
该接口就是函数式接口
修饰符:@interface(自动继承java.lang.annotation.Annotation接口)@元注解
元注解负责注解其他注解
Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)
4个标准的meta-annotation类型:
[email protected]
修饰注解定义
Annotation所修饰的对象范围
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
8.ANNOTATION_TYPE:指定该策略的注解只能修饰构造器
[email protected]
指定Annotation被保留的时间长短
必须为value成员变量指定值、
value成员变量的值只能是下面三个
1. RetentionPolicy.CLASS
编译器将把注解记录在class文件中,当运行java程序的时候JVM不可获取注解信息,这是默认值
2. RetentionPolicy.RUNTIME
编译器把注解记录在class文件中,当运行java程序的时候,JVM可以获取注解信息,可以通过反射获取信息。
3. RetentionPolicy.SOURCE
注解保留在源代码中,编译器直接丢掉这种注解
如果需要通过反射获取注解信息,就需要将value的属性值设置为RetentionPolicy.RUNTIME的@Retention(value=RetionPolicy.RUNTIME)
public interface Testable
@Retention (RetentionPolicy.SOURCE)
public @interface Testable{}
[email protected]
用于指定被元注解修饰的注解类将被javadoc工具提取成文档
如果定义注解类的时候用了@Documented修饰,则所有使用该注解修饰的程序元素的API文档将会包含该注释说明
[email protected]
被修饰的注解将具有继承性
Python中webbrowser使用参考
前言最近有一篇综述目标检测的论文《Deep Learning for Generic Object Detection: A Survey》,来自首尔国立大学的 Lee hoseong 在近期开源了「deep learning object detection」GitHub 项目,正是参考该论文开发的。该项目集合了从 2013 年 11 月提出的 R-CNN 至在近期发表的 M2Det 等几十篇...
问题描述某些情况下需要将卷积/池化层后的features map的某些patch映射回原图像,就需要features map怎么变过来的怎么回去。#read imageself.object_detector = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained = True, trainable_backbone_layers = 0)images_nested = torchvision.models.detection.
其中的大部分内容都是通用的,唯一的区别在于backbone中resnet输出的feature map,DETR输出的是[N,2048,H,W]维的tensor,而Deformable-DETR输出resnet最后三层的feature map,channel的维度分别为512,1024,2048,尺度分别除以8,16,32。Deformable-DETR代码基本沿用了DETR的工程,主要改了transformer部分的代码,输入的图像经过backbone以及数据进入encoder之前的部分内容可以参看。
什么是bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的。Bootstrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的,它简洁灵活,使得 Web 开发更加快捷...
图像分类经典论文翻译汇总:[翻译汇总]翻译pdf文件下载:[下载地址]此版为中英文对照版,纯中文版请稳步:[SENet纯中文版] Squeeze-and-Excitation Networks 挤压和激励网络 Jie Hu* Momenta [email protected] Li Shen* University of Oxford [email protected] Gang Sun
下载地址:PyTorch-YOLOv3源码下载地址预训练权重coco 数据集:http://images.cocodataset.org/zips/val2014.ziphttp://images.cocodataset.org/zips/train2014.zip参考资料:yolov3源码解析https://blog.csdn.net/qq_24739717/article/details/92399359create_custom_model.sh 脚本文件:用户自定义自己的模型,运行此
CVPR2020 Deepsnake论文源代码阅读笔记
一般来说,模态是指事物发生或存在的方式,多模态是指两个或者两个以上的模态的各种形式的组合。对每一种信息的来源或者形式,都可以称为一种模态(Modality),目前研究领域中主要是对图像,文本,语音三种模态的处理。之所以要对模态进行融合,是因为不同模态的表现方式不一样,看待事物的角度也会不一样,所以存在一些交叉(所以存在信息冗余),互补(所以比单特征更优秀)的现象,甚至模态间可能还存在多种不同的信息交互,如果能合理的处理多模态信息,就能得到丰富特征信息。即概括来说多模态的显著特点是: 冗余性 和 互补性。
Numpy中array(数组)Numpy主要对象是齐次多维数组,由正整数元组索引,Numpy中维度称为轴(axis),数组的维数称为秩(rank)。可以参考:Numpy快速入门1.1 创建数组常规方法创建数组import numpy as np#一维数组a=np.array([2,3,4])b=np.array([2.,3.,4.])#二维数组c=np.array([[1.,...
E3、E5分别代表入门、高端Xeon E3是针对工作站和入门级服务器的单路处理器系列,Xeon E5是针对高端工作站及服务器的处理器系列。但:Xeon E3的更新速度最快,每年跟随消费级的Corei7一同更新。Xeon E5每年更新,不过架构落后Xeon E3一代。参考:https://zhidao.baidu.com/question/1670312194941739707.htmlV2、V3...
author:skatetime:2012/04/11 io系统的监控工具-blktraceblktrace是一个可以显示block的io详细信息的工具,但他的输出信息太专业了,很难看懂,可以同通过blkiomon、blkparse等工具来查看。 下载 [[email protected] tmp]# wget ftp://mirror.switch.ch/pool/3/mi