反射(Reflection)机制是指在运行时动态地获取类的信息以及操作类的成员(字段、方法、构造函数等)的能力。通过反射,我们可以在编译时期未知具体类型的情况下,通过运行时的动态查找和调用。 虽然 Java 是静态的编译型语言,但是反射特性的加入,提供一种直接操作对象外的另一种方式,让 Java 具备的一些灵活性和动态性,我们可以通过本篇文章来详细了解它
Java 需要用到反射的主要原因包括以下几点:
AOP
),还有安全框架(方法调用前进行权限验证),还有在业务代码中注入一些通用的业务逻辑(例如一些日志,等,动态调用的能力都非常有用以下是一个简单的代码示例,展示基本的反射操作:
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) {
// 假设在运行时需要调用某个类的方法,但该类在编译时未知
String className = "com.example.MyClass";
try {
// 使用反射动态加载类
Class<?> clazz = Class.forName(className);
// 使用反射获取指定方法
Method method = clazz.getMethod("myMethod");
// 使用反射创建对象
Object obj = clazz.newInstance();
// 使用反射调用方法
method.invoke(obj);
} catch (ClassNotFoundException e) {
System.out.println("类未找到:" + className);
} catch (NoSuchMethodException e) {
System.out.println("方法未找到");
} catch (IllegalAccessException | InstantiationException e) {
System.out.println("无法实例化对象");
} catch (Exception e) {
System.out.println("其他异常:" + e.getMessage());
}
}
}
在这个示例中,我们假设在编译时并不知道具体的类名和方法名,但在运行时需要根据动态情况来加载类、创建对象并调用方法。使用反射机制,我们可以通过字符串形式传递类名,使用 Class.forName()
动态加载类。然后,通过 getMethod()
方法获取指定的方法对象,使用 newInstance()
创建类的实例,最后通过 invoke()
方法调用方法。
技术再好,如果无法落地,那么始终都是空中楼阁,在日常开发中,我们常常可以在以下的场景中看到反射的应用:
AOP
(Aspect-Oriented Programming)等功能。ORM
(对象关系映射):ORM
框架用于将对象模型和关系数据库之间进行映射。通过反射,ORM
框架可以在运行时动态地读取对象的属性和注解信息,从而生成相应的 SQL
语句并执行数据库操作。getDeclaredFields()
获取对象的所有字段,或使用getMethod()
获取对象的方法Class 对象是反射的第一步,我们先从 Class 对象聊起,因为在反射中,只要你想在运行时使用类型信息,就必须先得到那个 Class 对象的引用,他是反射的核心,它代表了Java类的元数据信息,包含了类的结构、属性、方法和其他相关信息。通过Class对象,我们可以获取和操作类的成员,实现动态加载和操作类的能力。
常见的获取 Class 对象的方式几种:
// 使用类名获取
Class<?> clazz = Class.forName("com.example.MyClass");
// 使用类字面常量获取
Class<?> clazz = MyClass.class;
// 使用对象的 getClass() 方法获取
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();
需要注意的是,如果
Class.forName()
找不到要加载的类,它就会抛出异常ClassNotFoundException
正如上面所说,获取 Class 对象是第一步,一旦获取了Class对象,我们可以使用它来执行各种反射操作,例如获取类的属性、方法、构造函数等。示例:
String className = clazz.getName(); // 获取类的全限定名
int modifiers = clazz.getModifiers(); // 获取类的修饰符,如 public、abstract 等
Class<?> superClass = clazz.getSuperclass(); // 获取类的直接父类
Class<?> superClass = clazz.getSuperclass(); // 获取类的直接父类
Class<?>[] interfaces = clazz.getInterfaces(); // 获取类实现的接口数组
Constructor<?>[] constructors = clazz.getConstructors(); // 获取类的公共构造函数数组
Method[] methods = clazz.getMethods(); // 获取类的公共方法数组
Field[] fields = clazz.getFields(); // 获取类的公共字段数组
Object obj = clazz.newInstance(); // 创建类的实例,相当于调用无参构造函数
上述示例仅展示了Class对象的一小部分使用方法,还有许多其他方法可用于获取和操作类的各个方面。通过Class对象,我们可以在运行时动态地获取和操作类的信息,实现反射的强大功能。
在反射的代码中,经常会对类型进行检查和判断,从而对进行对应的逻辑操作,下面介绍几种 Java 中对类型检查的方法
instanceof
关键字instanceof
是 Java 中的一个运算符,用于判断一个对象是否属于某个特定类或其子类的实例。它返回一个布尔值,如果对象是指定类的实例或其子类的实例,则返回true
,否则返回false
。下面来看看它的使用示例
1:避免类型转换错误
在进行强制类型转换之前,使用 instanceof
可以检查对象的实际类型,以避免类型转换错误或 ClassCastException
异常的发生:
if (obj instanceof MyClass) {
MyClass myObj = (MyClass) obj;
// 执行针对 MyClass 类型的操作
}
2:多态性判断
使用 instanceof
可以判断对象的具体类型,以便根据不同类型执行不同的逻辑。例如:
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
} else if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.meow();
}
3:接口实现判断
在使用接口时,可以使用 instanceof
判断对象是否实现了某个接口,以便根据接口进行不同的处理
if (obj instanceof MyInterface) {
MyInterface myObj = (MyInterface) obj;
myObj.doSomething();
}
4:继承关系判断
instanceof
可以用于判断对象是否是某个类的子类的实例。这在处理继承关系时非常有用,可以根据对象的具体类型执行相应的操作
if (obj instanceof MyBaseClass) {
MyBaseClass myObj = (MyBaseClass) obj;
// 执行 MyBaseClass 类型的操作
}
instanceof
看似可以做很多事情,但是在使用时也有很多限制,例如:
instanceof
运算符只能用于引用类型,无法用于原始类型instanceof
无法直接判断对象是否是某个泛型类型的实例
instanceof
看似方便,但过度使用它可能表明设计上的缺陷,可能违反了良好的面向对象原则。应尽量使用多态性和接口来实现对象行为的差异,而不是过度依赖类型检查。
isInstance()
函数java.lang.Class
类也提供 isInstance()
类型检查方法,用于判断一个对象是否是指定类或其子类的实例。更适合在反射的场景下使用,代码示例:
Class<?> clazz = MyClass.class;
boolean result = clazz.isInstance(obj);
如上所述,相比 instanceof
关键字,isInstance()
提供更灵活的类型检查,它们的区别如下:
isInstance()
方法的参数是一个对象,而 instanceof
关键字的操作数是一个引用类型。因此,使用 isInstance()
方法时,可以动态地确定对象的类型,而 instanceof
关键字需要在编译时指定类型。isInstance()
方法可以应用于任何Class
对象。它是一个通用的类型检查方法。而instanceof
关键字只能应用于引用类型,用于检查对象是否是某个类或其子类的实例。isInstance()
方法是在运行时进行类型检查,它的结果取决于实际对象的类型。而instanceof
关键字在编译时进行类型检查,结果取决于代码中指定的类型。instanceof
无法直接检查泛型类型参数。而isInstance()
方法可以使用通配符类型(<?>
)进行泛型类型参数的检查。总体而言,isInstance()
方法是一个动态的、通用的类型检查方法,可以在运行时根据实际对象的类型来判断对象是否属于某个类或其子类的实例。与之相比,instanceof
关键字是在编译时进行的类型检查,用于检查对象是否是指定类型或其子类的实例。它们在表达方式、使用范围和检查方式等方面有所差异。在具体的使用场景中,可以根据需要选择合适的方式进行类型检查。
代理模式是一种结构型设计模式,其目的是通过引入一个代理对象,控制对原始对象的访问。代理对象充当了原始对象的中间人,可以在不改变原始对象的情况下,对其进行额外的控制和扩展。这是一个简单的代理模式示例:
// 定义抽象对象接口
interface Image {
void display();
}
// 定义原始对象
class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading image:" + fileName);
}
@Override
public void display() {
System.out.println("Displaying image:" + fileName);
}
}
// 定义代理对象
class ImageProxy implements Image {
private String filename;
private RealImage realImage;
public ImageProxy(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
public class ProxyPatternExample {
public static void main(String[] args) {
// 使用代理对象访问实际对象
Image image = new ImageProxy("test_10mb.jpg");
// 第一次访问,加载实际对象
image.display();
// 第二次访问,直接使用已加载的实际对象
image.display();
}
}
输出结果:
Loading image:test_10mb.jpg
Displaying image:test_10mb.jpg
Displaying image:test_10mb.jpg
在上述代码中,我们定义了一个抽象对象接口 Image
,并有两个实现类:RealImage
代表实际的图片对象,ImageProxy
代表图片的代理对象。在代理对象中,通过控制实际对象的加载和访问,实现了延迟加载和额外操作的功能。客户端代码通过代理对象来访问图片,实现了对实际对象的间接访问。
Java的动态代理是一种在运行时动态生成代理类和代理对象的机制,它可以在不事先定义代理类的情况下,根据接口或父类来动态创建代理对象。动态代理使用Java的反射机制来实现,通过动态生成的代理类,可以在方法调用前后插入额外的逻辑。
以下是使用动态代理改写上述代码的示例:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义抽象对象接口
interface Image {
void display();
}
// 定义原始对象
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading image: " + filename);
}
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// 实现 InvocationHandler 接口的代理处理类
class ImageProxyHandler implements InvocationHandler {
private Object realObject;
public ImageProxyHandler(Object realObject) {
this.realObject = realObject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
if (method.getName().equals("display")) {
System.out.println("Proxy: before display");
result = method.invoke(realObject, args);
System.out.println("Proxy: after display");
}
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
// 创建原始对象
Image realImage = new RealImage("image.jpg");
// 创建动态代理对象
Image proxyImage = (Image) Proxy.newProxyInstance(Image.class.getClassLoader(), new Class[]{Image.class}, new ImageProxyHandler(realImage));
// 使用代理对象访问实际对象
proxyImage.display();
}
}
在上述代码中,我们使用 java.lang.reflect.Proxy
类创建动态代理对象。我们定义了一个 ImageProxyHandler
类,实现了 java.lang.reflect.InvocationHandler
接口,用于处理代理对象的方法调用。在 invoke()
方法中,我们可以在调用实际对象的方法之前和之后执行一些额外的逻辑。
输出结果:
Loading image: image.jpg
Proxy: before display
Displaying image: image.jpg
Proxy: after display
在客户端代码中,我们首先创建了实际对象 RealImage
,然后通过 Proxy.newProxyInstance()
方法创建了动态代理对象 proxyImage
,并指定了代理对象的处理类为 ImageProxyHandler
。最后,我们使用代理对象来访问实际对象的 display()
方法。
通过动态代理,我们可以更加灵活地对实际对象的方法进行控制和扩展,而无需显式地创建代理类。动态代理在实际开发中常用于 AOP
(面向切面编程)等场景,可以在方法调用前后添加额外的逻辑,如日志记录、事务管理等。
在 Java 中,通过反射机制可以突破对私有成员的访问限制。以下是一个示例代码,展示了如何使用反射来访问和修改私有字段:
import java.lang.reflect.Field;
class MyClass {
private String privateField = "Private Field Value";
}
public class ReflectionExample {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
MyClass myObj = new MyClass();
// 获取私有字段对象
Field privateField = MyClass.class.getDeclaredField("privateField");
// 取消对私有字段的访问限制
privateField.setAccessible(true);
// 获取私有字段的值
String fieldValue = (String) privateField.get(myObj);
System.out.println("Original value of privateField: " + fieldValue);
// 修改私有字段的值
privateField.set(myObj, "New Field Value");
// 再次获取私有字段的值
fieldValue = (String) privateField.get(myObj);
System.out.println("Modified value of privateField: " + fieldValue);
}
}
在上述代码中,我们定义了一个 MyClass
类,其中包含一个私有字段 privateField
。在 ReflectionExample
类的 main
方法中,我们使用反射获取了 privateField
字段,并通过 setAccessible(true)
方法取消了对私有字段的访问限制。然后,我们使用 get()
方法获取私有字段的值并输出,接着使用 set()
方法修改私有字段的值。最后,再次获取私有字段的值并输出,验证字段值的修改。
输出结果:
Original value of privateField: Private Field Value
Modified value of privateField: New Field Value
除了字段,通过反射还可以实现以下违反访问权限的操作:
虽然反射机制可以突破私有成员的访问限制,但应该慎重使用。私有成员通常被设计为内部实现细节,并且具有一定的安全性和封装性。过度依赖反射访问私有成员可能会破坏代码的可读性、稳定性和安全性。因此,在使用反射突破私有成员限制时,请确保了解代码的设计意图和潜在风险,并谨慎操作。
反射技术自 JDK 1.1
版本引入以来,一直被广泛使用。它为开发人员提供了一种在运行时动态获取类的信息、调用类的方法、访问和修改类的字段等能力。在过去的应用开发中,反射常被用于框架、工具和库的开发,以及动态加载类、实现注解处理、实现代理模式等场景。反射技术为Java的灵活性、可扩展性和动态性增添了强大的工具。
当下,反射技术仍然发挥着重要的作用。它被广泛应用于诸多领域,如框架、ORM
(对象关系映射)、AOP
(面向切面编程)、依赖注入、单元测试等。反射技术为这些领域提供了灵活性和可扩展性,使得开发人员能够在运行时动态地获取和操作类的信息,以实现更加灵活和可定制的功能。同时,许多流行的开源框架和库,如 Spring、Hibernate、JUnit
等,也广泛使用了反射技术。
反射技术可能继续发展和演进。随着 Java 平台的不断发展和语言特性的增强,反射技术可能会在性能优化,安全性,模块化等方面进一步完善和改进反射的应用。然而,需要注意的是,反射技术应该谨慎使用。由于反射涉及动态生成代码、绕过访问限制等操作,如果使用不当,可能导致代码的可读性和性能下降,甚至引入安全漏洞。因此,开发人员在使用反射时应该充分理解其工作原理和潜在的风险,并且遵循最佳实践。
大家好,又见面了,我是你们的朋友全栈君。beescms网站渗透测试修复意见目录1.环境搭建 2.渗透前信息收集 3.开始渗透 4.总结 5.修复建议Beescms实验环境搭建1、官方下载Beescmsv4.0,下载地址:http://beescms.com/cxxz.html 2、解压压缩文件,然后把文件放到phpstudy的网站根目录 3、浏览器访问http://127.0.0.1/beescms/install,开始安装 4、一直下一步,出现如下界面,输入数据库账户密码 5、成功安装 6、修改mysql.ini文件,在mysqld下添加条目:secure_file_priv=,保存然后重启phpstudy,不然用mysql写入文件会报错。 7、安装完成 渗透前信息收集1、用kali的dirb对网站目录进行扫描 同时也用sqlmap对网站进行注入扫描 sqlmap-u"http://靶机IP/newsletter&id=1"-pid 2、扫描完成后,sqlmap没有发现注入点,但是目录扫描发现了管理登录点,尝试对管理登录点进行漏洞测试 3、在这
什么是SSL证书SSL证书是用于在WEB服务器与浏览器以及客户端之间建立加密链接的加密技术,通过配置和应用SSL证书来启用HTTPS协议,来保护互联网数据传输的安全,全球每天有数以亿计的网站都是通过HTTPS来确保数据安全,保护用户隐私。UnderstandingSSLservercertificateswithExamplesSSL证书的作用为您的网站访客、企业建立信任和网络安全加密隐私数据。防止您访客的隐私信息(账号、地址、手机号等)被劫持或窃取地址栏安全锁。地址栏头部的“锁”型图表使您的访客放心浏览网页,提高用户信任度提高页面加载速度。提高用户体验,防止客户流失达到PCI标准。SSL是PCI合规性的关键组成部分安全身份认证。验证网站的真实性,防止钓鱼网站提高SEO排名。提高搜索排名顺序,为企业带来更多访问量防止网页篡改。防止数据在运输过程中被篡改,保护用户体验提升品牌形象。有利于企业获得更多利润,在与对手竞争中占据主动地位InstallandListRootCACertificateonLinux防止中间人攻击中间人攻击(Man-in-the-MiddleAttack,简称&qu
在Linux系统中,采用了虚拟内存管理技术,事实上大多数现在操作系统都是如此!在Linux系统中,每一个进程都在自己独立的地址空间中运行,在32位系统中,每个进程的逻辑地址空间均为4GB,这4GB的内存空间按照3:1的比例进行分配,其中用户进程享有3G的空间,而内核独自享有剩下的1G空间,如下所示:虚拟地址会通过硬件MMU(内存管理单元)映射到实际的物理地址空间中,建立虚拟地址到物理地址的映射关系后,对虚拟地址的读写操作实际上就是对物理地址的读写操作,MMU会将物理地址“翻译”为对应的物理地址,其关系如下所示:Linux系统下,应用程序运行在一个虚拟地址空间中,所以程序中读写的内存地址对应也是虚拟地址,并不是真正的物理地址,譬如应用程序中读写0x80800000这个地址,实际上并不对应于硬件的0x80800000这个物理地址。为什么需要引入虚拟地址呢?计算机物理内存的大小是固定的,就是计算机的实际物理内存,试想一下,如果操作系统没有虚拟地址机制,所有的应用程序访问的内存地址就是实际的物理地址,所以要将所有应用程序加载到内存中,但是我们实际的物理内存只有4G,所以就会出现一些问题:⚫当多
微软开源对于Solorigate活动捕获的开源CodeQL查询Solorigate攻击的一个关键方面是供应链攻击,这使攻击者可以修改SolarWindsOrion产品中的二进制文件。这些经过修改的二进制文件是通过以前合法的更新渠道分发的,并允许攻击者远程执行恶意活动,例如窃取凭据,提权和横向移动,以窃取敏感信息。该事件提醒组织不仅要考虑是否准备好应对复杂的攻击,还需要考虑自己代码库的弹性。微软坚信以透明的方式进行领导并与社区共享情报,从而改善整个行业的安全实践和状况。在此博客中,我们将分享审查代码库的过程,重点介绍一种特定的技术:使用CodeQL查询来大规模分析我们的源代码,并排除存在代码级别的危威胁情报(IoCs)和与Solorigate相关的代码模式。我们正在将本次本调查中使用的CodeQL查询开源,以便其他组织可以执行类似的分析。请注意,我们在此博客中介绍的查询仅可用于查找与Solorigate植入程序中的源代码具有相似之处的源代码,无论是在语法元素(名称,字面量等)还是功能上。两者可能在良性代码中同时发生,因此所有发现都需要进行审查以确定它们是否可行。此外,不能保证恶意行为者在
PPT:训练营人人有颗八卦的心运营-joyan.pptx演讲文稿:人人有颗八卦的心–管理应用产品运营在这样的大企业有很多意想不到的八卦消息,比如XXX总监被警察带走了,提前知晓了XX自制据的女主角,Pony下周一要出国了,腾讯也开始有自己的签约艺人了,《创造101》的宣传费用XXX身为有职业素养的运营人,当然这些信息是不会和大家分享的。我是来自TEG职能开发中心的Joy,目前是做EPO的系统运营。可能很多做技术的同学不了解EPO系统,EPO系统就属于管理应用范畴内的一个产品。管理应用顾名思义是基于管理目标服务于公司内业务流程化技术手段,一定程度上简化操作,让数据更透明。该类产品受众群体相对稳定,多数是公司层面统一使用的产品。基于管理应用领域的产品更注重流程的优化和管理目标的达成,一定程度上是弱化了用户体验。这也是为什么乐问上总有用户吐槽OA系统怎么这么难用。在这样的业务特点下,运营具体可以怎么做可以让产品得到更好的口碑?这里就对应上我们的主题“八卦”,运营离不开八卦用户和八卦数据。通常对接到运营的用户分为两类:事件类用户和需求类用户,底层都会“八卦“用户职级、职责,针对管理应用的产品不
温馨提醒:万字长文1分析背景:这是kaggle上的一份巴西传统线下汽车服务类连锁店的实际销售数据,大小约3.43G,包含了从2017年3月31日到2020年4月1日大约2600万多的销售数据。分析该数据集可以探究该连锁店的销售情况,产品的分布,可以对客户进行细分,精细化销售,对员工的生产力进行分析。这里是利用Python结合Tableau来进行分析,可视化用的Tableau,部分分析用的Python。数据解读:2分析框架3数据清洗3.1读取数据,看看总体情况这里的数据集比较大,Anaconda加载的数据都暂时存在内存里,笔者刚开始用的8G内存,一下子就满了,这里建议8-12G的内存左右,或者关闭一些暂时不用先的软件。#导入相关包 importnumpyasnp importpandasaspd #读取数据,设置分割符号 file_path=r'F:\alesReport.csv\SalesReport.csv' df=pd.read_csv(file_path,iterator=True,sep=';') data=df.get_chunk(3
publicHttpResponseMessageAddVisitNew(HttpRequestMessagerequest,CustomerVisitAddNewModelmodel) { returnCreateHttpPostResponse<long>(request,()=> { varres=customerVisitInfoService.AddVisitNew(model,CurrentUserId); if(string.IsNullOrEmpty(res.Error)) { //上传拜访记录照片 stringvisitPath=null; FtpClientftpClient=newFtpClient(GlobalConst.FtpAddress,GlobalConst.Username,GlobalConst.Password); stringvisitUploadDir=Path.Combine(GlobalConst.FILE_VISIT,"file"); for(vari=0;i<model.VisitPic.C
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/j_bleach/article/details/78472535背景最近接到一个需求,因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改。因此,需要用webpack单独打包指定文件。CommonsChunkPluginmodule.exports={ entry:{ app:APP_FILE//入口文件 }, output:{ publicPath:'./dist/',//输出目录,index.html寻找资源的地址 path:BUILD_PATH,//打包目录 filename:'[name].[chunkhash].js',//输出文件名 chunkFilename:'[name].[chunkhash].js'//commonChunk输出文件 } }复制题外话{先说一下publicPath,这边有一个注意的点,即路径写成./dist相对路径。如果写成/dist/这种绝
社交到视频会议,从金融到医疗,云端通信能力正在与传统的电话/IM、呼叫中心、企业通信融合,打通各个端与渠道的数据,实现实时互联与掌控。而音视频技术在其中扮演着重要的角色,如何为用户提供更低延迟、更佳体验的实时视频?如何保障海外业务的稳定性和高可用?AI技术如何为音视频赋能? 6月29日·北京|云+社区邀请了多位腾讯资深工程师,全面解析腾讯云音视频及融合通信技术,分享最新的低延迟技术、全新的商业直播方案技术实现以及音视频AI技术落地。讲师与话题蒋磊腾讯高级工程师Speaker:现任职于腾讯云终端研发中心,负责腾讯云视频服务客户端SDK的技术服务工作,曾先后就职于网易、阿里云,负责实时音视频、直播、点播、CDN、即时通信等业务相关技术工作,在音视频及IM业务的实际应用上经验丰富。 Topic:移动直播连麦技术实践连麦服务是直播中十分重要的一项增值业务,如何实现高质量的连麦服务,一直是众多业务开发者关注的话题,腾讯云基于自身十多年的音视频终端技术积累,结合强大的视频云服务,在连麦技术上进行了有效的实践,在此分享给大家。张鹏腾讯高级工程师 Speaker:现任X-P2P直播加速技术负责人,毕业
内置数据类型Int 一般来说,你不需要专门指定整数的长度。Swift提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同: 在32位平台上,Int和Int32长度相同。 在64位平台上,Int和Int64长度相同。 除非你需要特定长度的整数,一般来说使用Int就够了。这可以提高代码一致性和可复用性。即使是在32位平台上,Int可以存储的整数范围也可以达到-2,147,483,648~2,147,483,647,大多数时候这已经足够大了。 UInt Swift也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同: 在32位平台上,UInt和UInt32长度相同。 在64位平台上,UInt和UInt64长度相同。注意: 尽量不要使用UInt,除非你真的需要存储一个和当前平台原生字长相同的无符号整数。除了这种情况,最好使用Int,即使你要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,和匹配数字的类型推断。浮点数 浮点数是有小数部分的数字,比如3.14159,0.1和-273.15。 浮点类型比整数类型表示的范围更大,可以存储比I
点击标题下「大数据文摘」可快捷关注作者:郑磊(复旦大学数字与移动治理实验室主任) 回复“郑磊”可下载PPT全文很荣幸有这个机会向大家简要介绍一下这个报告的内容,这是第一次发布上海政务微信发展报告,只是一个初步的探索和分析,有待未来进一步的深入研究,所以今天很多结论或者建议不一定都是对的,只代表我们的观点和发现,和大家探讨和交流。具体的内容在书面报告里面都有。这个报告的主要目标,是对上海政务微信发展现状和趋势的分析,同时也介绍一些案例,更重要的是提出一些发展建议。刚才腾讯微信的李继芳女士介绍了微信这些年和政务的结合,现在腾讯有一个说法叫“连接一切”,过去两年,大量政府公众号和服务号上线,微信也把政府和公众连接起来了,政务微信已不仅仅是政府信息公开的渠道,同时也是一个政民互动的平台,对于服务型政府建设来说,成也为了政府提供公共服务的新平台。据7月13号中国传媒大学发布全国政务微信报告显示,全国政务微信总量已接近6千,开的最多的部门是公安,然后是共青团,各地政府的办公室,检察院和文物旅游系统,政务微信平台覆盖从中央部位到省市区,从地县到乡镇的所有行政级别,上海江苏山东宁夏河北等省直辖市一级已
上午闲着没事做就到站长资源平台看了下免费换链 浏览博客类网站时候发现有个网站在使用emlog明月浩空的模板 就想起了以前明月浩空的模板不是有漏洞 然后抱着试一试的心态看了下漏洞 我靠!!还真有漏洞 漏洞利用:/content/templates/lime.me/function/image.php?url=image.php复制 然后猜解出后台账号密码 登录后台 本来打算在附件中上传一句话但是每次都被拦截,导致封ip 只能SSR咯 然后想到了插件上传的方法,放到插件压缩包里直接上传 然后访问/content/plugins/bd_submit/2.php 成功了然后 本来是想在首页插一个js挖矿的,但是看是一个新站就没有了 对于服务器。。。。。。暂时没什么想法 是美国服务器可以弄个SSR 也就这样了 下面提供修复代码 以下代码收集于百度<?php header("Content-Type:image/x-icon;charset=utf-8"); functioncurl_get($url) { $ch=curl_init($url); cur
近年来,“大数据”日益成为国家基础性战略资源,其所蕴藏的巨大潜力和能量在各行各业不断积蓄的同时,整个数据行业的技术基础和实践能力也获得了长足的提升,对于数据的分析和应用能力在不少行业案例中都得到了良好的展现。单就运营而论,数据作为一种度量方式,能够真实地反映运营状况,帮助我们进一步了解产品、了解用户、了解渠道进而优化运营策略是其快速发展的根本动因。下面我们就从何为数据运营的三重门开始说起。数据运营的三重门数据的第一重门“交易门”客户与企业的交易数据。这重门以交易数据、日志数据为主,即客户的交易行为(买卖、刷卡、查询、投诉等)通过企业内部的生产作业系统记录留存,基本以“事后”数据为主,数据存在形式以结构化数据为主体。数据的第二重门“交互门”客户与企业的交互数据,我们形容为花园里面的数据。其特点是以用户与企业的各种交互数据为主,数据本身代表了客户的行为,如位置、点击、浏览、企业App内的操作行为、企业线下实体内的行为(购物中心内的到店足迹)等。此类数据开始出现大量非结构化,流式数据等多种形态。交互门与交易门的数据有什么不同,如何利用?例子一:沉睡、瞌睡客户的分析通过交易门内的数据发现的沉睡
在数据分析中,数据的获取是第一步,numpy.random模块提供了非常全的自动产生数据API,是学习数据分析的第一步。 总体来说,numpy.random模块分为四个部分,对应四种功能: 1.简单随机数:产生简单的随机数据,可以是任何维度 2.排列:将所给对象随机排列 3.分布:产生指定分布的数据,如高斯分布等 4.生成器:种随机数种子,根据同一种子产生的随机数是相同的 以下是详细内容以及代码实例:(以下代码默认已导入numpy:importnumpyasnp)1.生成器电脑产生随机数需要明白以下几点: (1)随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。 (2)只要用户不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值) (3)随机数产生的算法与系统有关,Windows和Linux是不同的,也就是说,即便是随机种子一样,不同系统产生的随机数也不一样。 numpy.random设置种子的方法有:函数名称函数功能参数说明RandomState定义种子类RandomState是一个种子类,提供了各
SRM623DIV21000pt 题意:给出一个最多50*50的矩阵,每个单元可能为'.'、'P'、'A','.'代表空地,你每次操作可以把一个P或者A拿到空地上,求一个最大的含有相同字符的矩形面积,最多K次操作。 首先用一个数组预处理出所有矩形所包含这三种字符的数量,然后枚举每一个矩形,如果只含有相同字符,那么这个面积是可以取到的。 如果含有多种字符,枚举含哪种字符时所需操作最少,大矩阵内如果含有一个及以上空地并且这个矩形的面积是小于等于你当前枚举的字符的数量,操作数=矩形内空地数+令一字符数*2 1#include<iostream> 2#include<cstdio> 3#include<cstring> 4#include<algorithm> 5#include<stdlib.h> 6#include<vector> 7#include<cmath> 8#include<queue> 9#include<set> 10usingnamespacestd; 11#de
题解: 首先可以贪心于是问题可以等价成一条边被算当且仅当子树中个数为奇数个 题解的做法比较简单 考虑每条边,加入其子树内的点 然后为了保证区间长度为偶数 分成f0,0f0,1f1,0f1,1即可 暴力插入复杂度不对改成启发式合并即可 这里插入的时候可用线段树维护把x-n这一段翻转即可 这样是两个log 一般可以用线段树合并优化启发式合并 但是这里改成线段树合并的话要换一种维护方式 我们维护左儿子ddl的个数来决定右儿子中的信息是直接加还是需要翻转 这样就可以线段树合并了 复杂度一个log 另外我开始想了一个2个log的做法 为了保证区间长度为偶数我们分成从奇数还是偶数开始两种情况,之后把两个看成一组 于是我们现在要维护的就是,到当前考虑的序列的点 树上的每个点,其子树内有偶数个点的方案数、奇数个点的方案数 然后观察插入两个点的时候 当且仅当这个点在两个点的路径上(除lca)增加了奇数个点,其余都是增加偶数个点 取出两点路径可以利用树链剖分 然后要支持两种操作1.偶数=原本奇数,奇数=原本偶数+12.偶数=原本偶数+1,奇数=原本奇数 这个我们采用线段树维护 维护三个标记r
题意:求最大流/一条流量最大的路的流量。(此题HDU上数据水,下面俩种错误的都能过。。。。) 思路1;每次增广的时候更新流量,保存最大的那条。 错误性:每次更新,有可能最大的那条流量是前几次已经增广过的(每次是增广多条的),使得最大的那条被分解了。网上有20%代码是这样的。(下面的第数据2,3不过了) 思路2:每次增广的时候,更新当前每条边的容量的最值。貌似可以,错误性:最大流量也有可能被分流击杀(数据4)。 我的解法:既然不能偷懒(可能没有想到如何借助增广时候来维护),就自己dfs预先搜一遍,求出最大流量即可。 数据: 4 16705 014 144 454 023 253 033 353 26605 015 125 235 344 455 042 36605 0170 1240 2440 1320 3420 4550 47815 125 232 352 243 453 265 675 755 答案:2.5001.2501.2501.000 #include<iostream> #include<queue> #inclu
1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Linq; 4usingSystem.Text; 5usingSystem.Threading.Tasks; 6usingSystem.Data; 7usingSystem.Data.SqlClient; 8 9namespaceww 10{ 11classProgram 12{ 13staticvoidMain(string[]args) 14{ 15Console.Write("请选择操作:1:增加记录2:删除记录3:修改记录4:查询记录\n"); 16stringtr=Console.ReadLine(); 17switch(tr) 18{ 19case"1": 20Console.WriteLine("**************************增加记录*****************************"); 21ww.Class1.insert(); 22break; 23case"2": 24Console.WriteLine("**
前言 最近在做项目时候,遇到一个这样子的需求, 点到卡包里面卡券使用使用,需要展示卡券使用附近门店, 思路 数据库地址表设计 通用的区域街道地址表tz_sys_area 字段名称 类型 备注 area_id bigint 区域ID area_name varchar(32) 区域名称 parent_id bigint 所属父区域ID level int 层级 type char 区域类型0国家1省份直辖市2地市3区县 area_name varchar(32) 区域名称 parent_id bigint 所属父区域ID level int 层级 后台也可以做修改 四级区域地址数据来源我在网上找的json文件然后按照格式倒入到的数据库,需要的可以关注我的公众号猿小叔 门店地址表tz_address 需求实现 这里计算距离就需要用到经纬度 需要使用高德地图api接口地理/逆地理编码获取地址经纬度并保存 /** *地理/逆地理编码 *https://lbs.amap.com/api/webservice/guide/api/
前言 vue.js的灵魂是组件,而组件的灵魂是插槽。借助于插槽,我们能最大程度上实现组件复用。本文主要是对插槽的实现机制进行详细概括总结,在某些场景中,有一定的用处。知其然知其所以然,掌握vue.js实现原理,不仅可以提升自身解决问题的能力,还可以学习到大神们编程思想和开发范式。 样例代码 <!--子组件comA--> <template> <divclass='demo'> <slot><slot> <slotname='test'></slot> <slotname='scopedSlots'test='demo'></slot> </div> </template> <!--父组件--> <comA> <span>这是默认插槽</span> <templateslot='test'>这是具名插槽</template> <templateslot='scopedSlots's
NTLM篇:NTLanManager 在这之前,Windows主要采用另一种认证协议——NTLM(NTLanManager)。NTLM使用在WindowsNT和Windows2000Server(orlater)工作组环境中(Kerberos用在域模式下)。在AD域环境中,如果需要认证WindowsNT系统,也必须采用NTLM。较之Kerberos,基于NTLM的认证过程要简单很多。NTLM采用一种质询/应答(Challenge/Response)消息交换模式 步骤一 用户通过输入Windows帐号和密码登录客户端主机。在登录之前,客户端会缓存输入密码的哈希值,原始密码会被丢弃(“原始密码在任何情况下都不能被缓存”,这是一条基本的安全准则)。成功登录客户端Windows的用户如果试图访问服务器资源,需要向对方发送一个请求。该请求中包含一个以明文表示的用户名。 步骤二 服务器(比如文件服务器)接收到请求后,生成一个16位的随机数。这个随机数被称为Challenge或者Nonce。服务器在将该Challenge发送给客户端之前,该Challenge会先被保存起来。Chall