Alex

有的故事值得一直说下去.
Home » Latest Posts

反射就是通过字节码文件获取类的成员变量、构造方法和成员方法的所有信息。

利用反射,我们可以获取成员变量的修饰符、名字、类型、取值。我们可以获取构造方法的名字、形参,并利用通过反射获取的构造方法创建对象。我们可以获取成员方法的修饰符、名字、形参、返回值、抛出的异常、注解,并运行通过反射获取的方法。

2304252-20240718195953917-598211124

比如idea中的自动提示就是通过反射获取的,idea通过反射获取该对象的所有能调用的方法,并将它显示出来,又比如idea中函数的形参提示也是通过反射获取的。

反射是通过字节码文件对象获取成员变量、成员方法、构造方法的所有信息,所以,我们先要获取字节码文件对象,再去从字节码文件对象中获取成员变量、构造方法和成员方法,最后再进行解剖获取所有信息。

获取class对象的3种方式:

1)class.forName("全类名");
(2)类名.class;
(3)对象.getClass();

那我们应该如何选择呢?

创建一个类的对象,我们需要经历以下3个阶段:

  • 源代码阶段:Java->class,在这个阶段,虚拟机是没有把代码加载到内存当中的,全都是硬盘中进行操作。在这个阶段用第一种方式获取class字节码文件对象。第一种方式最为常用。
  • 加载阶段:把字节码文件加载到内存中。这个阶段使用第二种方式来获取字节码文件对象。第二种方式通常都是当作参数进行传递。
  • 运行阶段:在该阶段使用第三种方式。当我们已经有了这个类的对象时才可以使用第三种方式。

利用反射获取构造方法:

Constructor<?>[] getConstructors()//返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors()//返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>..parameterTypes)//返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes)//返回单个构造方法对象
T newInstance(Object... initargs)//根据指定的构造方法创建对象
setAccessible(boolean flag)//设置为true可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//setAccessible(boolean flag)使用示例
public class Example {
    private String privateField = "privateValue";
}
public class AnotherClass {
    public static void main(String[] args) throws Exception {
        Example instance = new Example();
        Field field = Example.class.getDeclaredField("privateField");
        field.setAccessible(true);
        System.out.println("Private Field Value: " + field.get(instance)); // 可以通过反射访问私有字段
    }
}

Class类中用于获取成员变量的方法:

Field[] getFields()//返回所有公共成员变量对象的数组
Field[] getDeclaredFields()//返回所有成员变量对象的数组
Field getField(String name)//返回单个公共成员变量对象
Field getDeclaredField(Stringname)//返回单个成员变量对象
void set(Object obj, Object value)//给成员变量赋值
Object get(Object obj)//获取成员变量的值。
setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//set,get示例
public class Example {
    private String name;
    private int age;

    public static void main(String[] args) throws Exception {
        Example example = new Example();

        Field nameField = Example.class.getDeclaredField("name");
        Field ageField = Example.class.getDeclaredField("age");

        // 设置字段值
        nameField.set(example, "John Doe");
        ageField.set(example, 30);

        // 获取字段值
        System.out.println("Name: " + nameField.get(example));
        System.out.println("Age: " + ageField.get(example));
    }
}

Class类中用于获取成员方法的方法:

Method[] getMethods()//返回类中所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()//返回类中所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes)//返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes)//返回单个成员方法对象
Object invoke(Object obj,Object... args)//运行方法
//参数一:用obj对象调用该方法
//参数二:调用方法的传递的参数(如果没有就不写)
//返回值:方法的返回值(如果没有就不写)
setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。

//invoke使用示例:
public class Example {
    public void greet(String name) {
        System.out.println("Hello, " + name + "!");
    }

    public static void main(String[] args) throws Exception {
        Example example = new Example();
        Method method = Example.class.getMethod("greet", String.class);

        // 调用 greet 方法
        method.invoke(example, "John");
    }
}
注意:获取公共方法时也会获取父类中的所有公共方法。获取所有权限的方法时,就不会获取父类的方法

Jenkins 使用curl执行远程触发命令,会报403错误

1009724-20240226175123738-971501766

打开如下图

1009724-20240226175218101-837403772

 

系统管理-》script Console

在下面脚本命令行中输入
hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION = true

1009724-20240226175753409-1936803870

 

查看-》系统管理-》全局安全配置

1009724-20240226175412664-1644536369

 

最后,请求成功

1009724-20240226175524663-306056458

 

简介
 
如官网首页介绍所言,在吐槽mongo放弃了其开源的根本,变更了开源许可导致使其无法用于一些开源和商业项目后,强调了ferretdb不是另一种nosql数据库,而是利用mongo生态,可以像使用mongo一样使用ferretDB。底层使用postgres进行存储。
数据库安装
安装PostgreSQL
//安装epel源
sudo yum install epel-release
//更新
yum update
# 安装RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PostgreSQL:
sudo yum install -y postgresql14-server
sudo /bin/postgresql-14-setup initdb
# 配置服务
sudo systemctl enable postgresql-14
sudo systemctl start postgresql-14
安装完成后,按下图箭头所示,修改配置文件,保存并重启服务
vim /var/lib/pgsql/14/data/pg_hba.conf
连接数据库进行用户创建
sudo -u postgres psql
CREATE USER ferretuser WITH PASSWORD 'Passw0rd!';
CREATE DATABASE ferretuser OWNER ferretuser;
\q
添加系统用户
sudo adduser ferretuser
连接测试
$ sudo -u ferretuser psql
psql (14.8)
Type "help" for help.
ferretuser=> \q
安装ferretDB
从官方github上下载rpm安装包,执行安装命令,安装完成后执行查看如下图:
 
创建sh执行文件
#!/bin/bash
ferretdb --mode="normal" --listen-addr="0.0.0.0:27017" --postgresql-url='postgres://ferretuser:[email protected]:5432/ferretuser'
创建service文件
#!/bin/sh
[Unit]
Description=FerretDB by XXX
After=network.target
[Service]
Type=simple
ExecStart=/etc/systemd/system/ferretdb.sh
ExecStop=/etc/systemd/system/ferretdb.sh
Restart=no
RestartSec=30s
[Install]
WantedBy=multi-user.target
重新加载并启动服务
sudo systemctl daemon-reload
sudo systemctl enable ferretdb
sudo systemctl start ferretdb
查看服务状态
 
如是,ferretDB安装完成,可使用mongosh、navicat、IDEA等第三方,像连接/操作mongo一样连接/操作ferretDB
ferretDB官网
Github地址
主要参考
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/KKKyi/article/details/131539081

安装
sudo apt install podman
1
运行
lwk@qwfys:~$ podman pull mysql:5.7.43
Error: short-name "mysql:5.7.43" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"
lwk@qwfys:~$
1
2
3
配置
sudo tee /etc/containers/registries.conf <<-'EOF'
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "we7rwaj4.mirror.aliyuncs.com"
[[registry.mirror]]
location = "docker.mirrors.tuna.tsinghua.edu.cn"
[[registry.mirror]]
location= "ghcr.io"
EOF
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
拉取
lwk@qwfys:~$ podman pull docker.io/mysql:5.7.43
Trying to pull docker.io/library/mysql:5.7.43...
Getting image source signatures
Copying blob 1ffa0e0ca707 done
Copying blob 7ca4383b183f done
Copying blob 70e9ff4420fb done
Copying blob 3e282e7651b1 done
Copying blob b4b277ff2929 done
Copying blob 6eb790cf6382 done
Copying blob 692fe4469429 done
Copying blob c0d447d97bbd done
Copying blob a9ae52de4d77 done
Copying blob 99ee594517ba done
Copying blob 66cc05a182b5 done
Copying config 92034fe9a4 done
Writing manifest to image destination
Storing signatures
92034fe9a41f4344b97f3fc88a8796248e2cfa9b934be58379f3dbc150d07d9d
lwk@qwfys:~$
————————————————
知识在分享中升华,思想在交流中沉淀。
原文链接:https://blog.csdn.net/qwfys200/article/details/132232809

20240414172502-1
在网页打印时,有时候我们需要在打印页面的页眉或页脚中显示页码信息,以便于阅读和管理。在 CSS 中,我们可以通过一些特定的属性和伪类来实现这一功能。本文将详细介绍如何在网页打印时取得页眉页脚的页码,并提供相关的示例代码。

1. 在页眉中显示页码

要在页眉中显示页码,我们可以使用 @page 规则和 content 属性来实现。下面是一个简单的示例代码:

@page {
@top-center {
content: "Page " counter(page);
}
}
body {
counter-reset:page;
}
h1 {
page-break-before:always;
}
p {
page-break-inside:avoid;
}
CSS

在上面的示例中,我们使用 @page 规则定义了在页眉中显示页码的样式,通过 content: "Page " counter(page); 来显示页码信息。在 body 元素中使用 counter-reset: page; 来初始化页码计数器。在 h1 元素前插入分页符,避免段落中断。

2. 在页脚中显示页码

类似地,我们也可以在页脚中显示页码信息。下面是一个示例代码:

@page {
@bottom-center {
content: "Page " counter(page);
}
}
CSS

在上面的示例中,我们使用 @page 规则定义了在页脚中显示页码的样式,通过 content: "Page " counter(page); 来显示页码信息。

3. 在页眉和页脚中显示不同的页码

有时候我们需要在页眉和页脚中显示不同的页码信息,可以通过 @top-left@top-right@bottom-left@bottom-right 等属性来实现。下面是一个示例代码:

@page {
@top-left {
content: "Header Page " counter(header);
}
@bottom-right {
content: "Footer Page " counter(footer);
}
}
body {
counter-reset:header footer;
}
h1 {
page-break-before:always;
}
p {
page-break-inside:avoid;
}
CSS

在上面的示例中,我们使用 @top-left 和 @bottom-right 属性分别定义了页眉和页脚中显示不同的页码信息,通过 content: "Header Page " counter(header); 和 content: "Footer Page " counter(footer); 来显示不同的页码信息。

4. 自定义页码格式

除了显示简单的页码信息外,我们还可以自定义页码的格式,比如添加前缀、后缀、间隔符等。下面是一个示例代码:

@page {
@bottom-center {
content: "Page " counter(page,upper-roman) " of " counter(pages);
}
}
CSS

在上面的示例中,我们使用 counter(page, upper-roman) 来显示罗马数字格式的页码,使用 counter(pages) 来显示总页数。

5. 控制打印页面的页眉页脚显示与否

有时候我们需要在打印页面时控制页眉页脚的显示与否,可以通过 display 属性来实现。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
display:none;
}
}
CSS

在上面的示例中,我们使用 display: none; 来控制打印页面的页眉不显示。

6. 控制打印页面的页眉页脚位置

除了显示内容外,我们还可以控制打印页面的页眉页脚的位置,比如居中、居左、居右等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
}
@bottom-left {
content: "Footer Page " counter(page);
}
@bottom-right {
content: "Footer Page " counter(page);
}
}
CSS

在上面的示例中,我们使用 @top-center@bottom-left@bottom-right 属性来控制页眉页脚的位置。

7. 控制打印页面的页眉页脚样式

除了位置外,我们还可以控制打印页面的页眉页脚的样式,比如字体、颜色、大小等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
font-family: Arial,sans-serif;
color: #333;
font-size: 12px;
}
}
CSS

在上面的示例中,我们使用 font-family: Arial, sans-serif;color: #333;font-size: 12px; 来控制页眉的字体、颜色和大小。

8. 控制打印页面的页眉页脚边距

有时候我们需要控制打印页面的页眉页脚的边距,可以通过 margin 属性来实现。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
margin-top: 20px;
margin-bottom: 10px;
}
}
CSS

在上面的示例中,我们使用 margin-top: 20px;margin-bottom: 10px; 来控制页眉的上边距和下边距。

9. 控制打印页面的页眉页脚边框

除了边距外,我们还可以控制打印页面的页眉页脚的边框,比如线型、颜色、粗细等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
border-top: 1pxsolid#333;
border-bottom: 1pxdashed#666;
}
}
CSS

在上面的示例中,我们使用 border-top: 1px solid #333;border-bottom: 1px dashed #666; 来控制页眉的上边框和下边框。

10. 控制打印页面的页眉页脚背景

除了边框外,我们还可以控制打印页面的页眉页脚的背景颜色、图片等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
background-color: #f0f0f0;
}
}
CSS

在上面的示例中,我们使用 background-color: #f0f0f0; 来控制页眉的背景颜色。

11. 控制打印页面的页眉页脚透明度

除了背景色外,我们还可以控制打印页面的页眉页脚的透明度。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
background-color: rgba(255, 255, 255, 0.5);
}
}
CSS

在上面的示例中,我们使用 background-color: rgba(255, 255, 255, 0.5); 来控制页眉的背景透明度。

12. 控制打印页面的页眉页脚固定位置

有时候我们需要在打印页面时固定页眉页脚的位置,可以通过 position 属性来实现。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
position: fixed;
}
}
CSS

在上面的示例中,我们使用 position: fixed; 来固定页眉的位置。

13. 控制打印页面的页眉页脚浮动位置

除了固定位置外,我们还可以控制打印页面的页眉页脚的浮动位置,比如居左、居右、居中等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
position:absolute;
left: 50%;
transform: translateX(-50%);
}
}
CSS

在上面的示例中,我们使用 position: absolute;left: 50%;transform: translateX(-50%); 来控制页眉居中显示。

14. 控制打印页面的页眉页脚旋转角度

有时候我们需要在打印页面时旋转页眉页脚的角度,可以通过 transform 属性来实现。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
transform: rotate(45deg);
}
}
CSS

在上面的示例中,我们使用 transform: rotate(45deg); 来旋转页眉的角度。

15. 控制打印页面的页眉页脚隐藏

有时候我们需要在打印页面时隐藏页眉页脚,可以通过 display 属性来实现。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
display:none;
}
}
CSS

在上面的示例中,我们使用 display: none; 来隐藏页眉。

16. 控制打印页面的页眉页脚显示

除了隐藏外,我们还可以控制打印页面的页眉页脚的显示,比如显示在所有页面、只显示在第一页等。下面是一个示例代码:

@page {
@top-center {
content: "Page " counter(page);
display:block;
}
@page :first {
@top-center {
display:none;
}
}
}
CSS

在上面的示例中,我们使用 display: block; 来显示页眉,在 @page :first 中使用 display: none; 来隐藏第一页的页眉。

17. 控制打印页面的页眉页脚打印时显示

有时候我们需要在打印页面时才显示页眉页脚,可以通过 @media print 媒体查询来实现。下面是一个示例代码:

@media print {
@page {
@top-center {
content: "Page " counter(page);
}
}
}
CSS

在上面的示例中,我们使用 @media print 媒体查询来控制打印时显示页眉。

18. 控制打印页面的页眉页脚页面间距

有时候我们需要控制打印页面的页眉页脚与页面内容的间距,可以通过 margin 属性来实现。下面是一个示例代码:

@page {
margin: 20mm;
@top-center {
content: "Page " counter(page);
}
}
CSS

在上面的示例中,我们使用 margin: 20mm; 来控制页眉与页面内容的间距。

19. 控制打印页面的页眉页脚页面大小

有时候我们需要控制打印页面的页眉页脚的大小,可以通过 size 属性来实现。下面是一个示例代码:

@page {
size:A4;
@top-center {
content: "Page " counter(page);
}
}
CSS

在上面的示例中,我们使用 size: A4; 来控制页眉页脚的页面大小。
通过以上示例代码,我们可以灵活地控制打印页面的页眉页脚的显示、样式、位置等,以满足不同需求。
 

Life is fantastic
🥕 More