ssmgr
相关文档: https://github.com/shadowsocks/shadowsocks-manager/
https://shadowsocks.github.io/shadowsocks-manager/#/home
https://blog.tearth.me/ssmgr_1/ 安装shadowsocks-manager
https://www.cnblogs.com/baby123/p/6477429.html nohup和&后台运行,进程查看及终止
相关文档: https://github.com/shadowsocks/shadowsocks-manager/
https://shadowsocks.github.io/shadowsocks-manager/#/home
https://blog.tearth.me/ssmgr_1/ 安装shadowsocks-manager
https://www.cnblogs.com/baby123/p/6477429.html nohup和&后台运行,进程查看及终止
V2Ray 不区分服务器版和客户端版,它们运行的是同一个软件,区别是配置文件的不同。
问题:外网无法访问部署在内网的 MySQL,导致 SpringBoot 项目启动时连不上数据库,接口无法调试,开发效率低。
解决:参考以下方式部署 v2ray,然后配置 JVM 参数 -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=18998
在服务器部署 V2Ray 客户端。配置文件如下(更多配置见官网 v2fly):
1 | { |
执行 chmod ./v2ray +x 、 ./v2ray run 启动 V2Ray 客户端,可以使用 SwitchyOmega 插件测试 socks 代理是否生效。
注意:
Navicat 不支持 socks 代理,但可以使用 HTTP 隧道。Nginx 配置见 Nginx教程 章节的 常用配置。具体参考 https://blog.csdn.net/baikunlong/article/details/132596536 。
在服务器部署 V2Ray 服务端,本地部署客户端。
1 | mkdir -p /data/local/v2ray-linux-64/log/ |
服务端配置(更多配置见官网 v2fly):
1 | { |
Linux 启动前需授予可执行权限 chmod ./v2ray +x,然后参考下文 开机自启 。
客户端配置(更多配置见官网 v2fly):
1 | { |
新建 windows 启动脚本 D:\Program\v2ray-windows-64\v2ray-run.cmd 内容如下:
1 | v2ray.exe run |
1 | nohup /data/local/v2ray-linux-64/v2ray run -config /data/local/v2ray-linux-64/config.json &>/dev/null & |
v2ray-linux-64.zip 解压文件中包含 systemd/system/v2ray.service,需要的选项包括 User、ExecStart 等。
vim /etc/systemd/system/v2ray.service
1 | # v2ray.service |
重新加载配置文件:systemctl daemon-reload
If you want to keep a secret, you must also hide it from yourself.
Project V,一个工具集合,官网: https://www.v2ray.com/ ,它可以帮助你打造专属的基础通信网络。Project V 的核心工具称为V2Ray,其主要负责网络协议和功能的实现,与其它 Project V 通信。V2Ray 可以单独运行,也可以和其它工具配合,以提供简便的操作流程。
Project V 工具比较复杂,本文仅针对 Shadowsocks 。
markdown转html后没有缩进问题:
1 |   半角空格 |
注意注意:H5不=HTML5
H5 是一个产品名词
HTML5是一个技术名词
PL/SQL Developer 工具的 SQL 窗口只能执行 SQL 和 PLSQL,执行命令使用命令窗口。
https://www.youtube.com/watch?v=BHzgsKi3dI4&list=PLD3Xyx6ef38yPjePP9e0yfIwX4lGOcb3w&index=28
建立时的字段顺序和条件中的字段顺序相同才会走索引。
当某字段的值连续增长时,构建标准索引会形成歪脖子树,查询性能不理想。反向建索引,可以让索引的值变得不规则,从而使索引树均匀分布。
1 | create index 索引名称 on 表名(列名) reverse; |

1 | create [public] SYNONYM 同义词名称 for object |
public 是可选的,不加就是私有同义词,只能被当前用户使用。object 可以是表、试图、序列等要创建同义词的对象名称。
为表 T_OWNERS 创建(私有)同义词,名称为 OWNERS,语句:
1 | create synonym OWNERS for T_OWNERS; |
使用同义词
1 | select * from OWNERS; |
主要用来简化数据操作。
视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。比如不希望一张表的敏感信息被他人查看,可以只赋予视图权限,而且只读。
提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。比如改表字段导致查询无法使用,可以使用视图查询。
1 | CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name |
alias:为视图产生的列定义的别名;
subquery :一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY :默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
键保留表:把主键保留下来的那个表。通过视图查询的数据中,主键来自哪个表,哪个表就是键保留表,只能修改键保留表中的数据,而不能修改其他表的数据。
聚合统计的视图是没有键保留表的,这种视图都是只读的。
https://www.youtube.com/watch?v=mo61cAiV0HE&list=PLD3Xyx6ef38yPjePP9e0yfIwX4lGOcb3w&index=45
1 | CREATE METERIALIZED VIEW view_name |
会生成一个表。
刷新模式:
刷新方法:
刷新时间(可选):
物化视图生成的表数据
1 | begin |
也可以使用命令刷新,打开命令窗执行:
1 | EXEC DBMS_MVIEW.refresh('VIEW_NAME', 'C'); |
此日志记录了基表发生的变化(增、删、改),物化视图用记录来刷新数据行,刷新完成后会自动删除日志记录,所以若要看到效果可以将物化视图定义为手动刷新(demand),当基表变化是查看日志表,手动刷新后,日志表数据被删除。
1 | create materialized view log on 物化视图使用的表名 with rowid(或者主键); -- 根据rowid更新物化视图 |
会生成一张表,默认物化视图日志的表名格式:MLOG$_表名。
使用imp命令和exp命令对oracle数据库进行导入导出操作
整库导入导出
https://www.youtube.com/watch?v=_zOp8S4uQQ4&list=PLD3Xyx6ef38yPjePP9e0yfIwX4lGOcb3w&index=15
按用户和表导入导出
https://www.youtube.com/watch?v=2BoHiT_ymC4&list=PLD3Xyx6ef38yPjePP9e0yfIwX4lGOcb3w&index=16
反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问、检测、修改自身状态与行为的能力。这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革命,出现了多种支持反射机制的面向对象语言。
Java 反射(Reflection)机制就是在运行状态中,对于 任意 一个类,都能够获取到这个类的所有属性和方法。对于 任意 一个对象,都能够调用它的**任意一个方法和属性(包括私有的方法和属性)。这种动态获取的信息以及动态调用对象的方法的功能**就称为 Java 语言的反射机制。
通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
Java 程序中对象的类型都是在编译期就确定下来的。但通过 Java 反射机制动态创建的对象,这个对象的类型在编译期是未知的。
反射的核心是 JVM 在 运行时 才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。反射机制就是通过 java.lang.Class 类来实现的,在 Java 中,Object 类是所有类的根类,而 Class 类就是描述 Java 类的类。
注:
Class本身就是一个类,Class就是这个类的名称,所以Object也包括Class类。
反射最重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过 XML 文件配置 JavaBean、Action 之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类(运行时动态加载),调用不同的方法,这个时候就必须用到反射。对与框架开发人员来说,反射虽小但作用非常大,它是各种容器实现的核心。
反射机制中会用到一些类,在了解反射是如何使用之前,先介绍一下这些类。
| 类 | 说明 |
|---|---|
| Object | Java 中所有类的超类 |
| Class | 在反射中表示内存中的一个 Java 类,Class 可以代表的实例类型包括,类和接口、基本数据类型、数组 |
| Constructor | 封装了类的构造函数的属性信息,包括访问权限和动态调用信息 |
| Field | 提供类或接口的成员变量属性信息,包括访问权限和动态修改 |
| Method | 提供类或接口的方法属性信息,包括访问权限和动态调用信息 |
| Modifier | 封装了修饰属性,public、protected、static、final、synchronized、abstract 等 |
声明一个接口和一个简单的具体类作为示例代码:
声明一个接口:
1 | public interface IAddress { |
具体的类,请关注各个方法的修饰属性:
1 | public class Person implements IAddress { |
想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class 文件对象),通过字节码文件对象,能够获取想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等)。每一个类对应一个字节码文件,也就对应着一个 Class 类型的对象,也就是字节码文件对象。
反射的各种功能都需要通过 Class 对象来实现,因此,需要知道如何获取 Class对象,主要有以下几种方式:
1 | public class Test { |
一般地,可以使用 instanceof 关键字来判断是否为某个类的实例。同时也可以借助反射中 Class 对象的 isInstance() 方法来判断是否为某个类的实例,它是一个 Native 方法:
1 | public class Test { |
1 | public class Test { |
通过反射来生成对象主要有两种方式:
1 | public class Test { |
获取某个 Class 对象的方法集合,主要有以下几个方法:
Method getMethod(String name, Class<?>... parameterTypes): 获取“名称是name,参数是parameterTypes”的public的函数(包括从基类继承的、从接口实现的所有public函数)。Method[] getMethods(): 获取全部的public的函数(包括从基类继承的, 从接口实现的所有public函数)。Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取”名称是name,参数是parameterTypes”,并且是类自身声明的函数,包含public、protected和private方法。Method[] getDeclaredMethods(): 获取全部的类自身声明的函数,包含public、protected和private方法。Method getEnclosingMethod(): 如果这个类是“其它类中某个方法的内部类”,调用getEnclosingMethod()就是这个类所在的方法,若不存在,返回null。没懂…代码示例:
1 | public class Test { |
输出:
1 | 指定的public方法: |
获取某个 Class 对象的构造方法,主要有以下几个方法:
Constructor<T> getConstructor(Class<?>... parameterTypes): 获取 参数是parameterTypes 的public的构造函数。 parameterTypes 参数是一个Class对象数组,这些对象按声明的顺序标识构造函数的形参类型。Constructor<?>[] getConstructors(): 获取全部的public构造函数。Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取 参数是parameterTypes 的,并且是类自身声明的构造函数,包含public、protected和private。Constructor<?>[] getDeclaredConstructors(): 获取类自身声明的全部的构造函数,包含public、protected和private。Constructor<?> getEnclosingConstructor(): 如果这个类是“其它类的构造函数中的内部类”,调用 getEnclosingConstructor() 就是这个类所在的构造函数,若不存在,返回null。没懂…代码示例:
1 | public class Test { |
输出:
1 | 指定的public构造函数: |
获取某个 Class 对象的成员变量,主要有以下几个方法:
Field getField(String name): 获取 名称是name 的public的成员变量(包括从基类继承的, 从接口实现的所有public成员变量)。Field[] getFields(): 获取全部的public成员变量(包括从基类继承的、从接口实现的所有public成员变量)。Field getDeclaredField(String name): 获取 名称是name,并且是类自身声明的成员变量,包含public、protected和private成员变量。Field[] getDeclaredFields(): 获取全部的类自身声明的成员变量,包含public、protected和private成员变量。Class 类提供了大量的实例方法来获取该 Class 对象所对应的详细信息,Class 类大致包含如下方法,其中每个方法都包含多个重载版本,因此我们只是做简单的介绍,详细请参考 JDK 文档。
Constructor<T> getConstructor(Class<?>... parameterTypes)Method getMethod(String name, Class<?>... parameterTypes)Field getField(String name)<A extends Annotation> A getAnnotation(Class<A> annotationClass)Class<?>[] getDeclaredClasses()Class<?> getDeclaringClass()Class<?>[] getInterfaces()int getModifiers()Package getPackage()String getName()String getSimpleName()boolean isAnnotation()boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)boolean isAnonymousClass()boolean isArray()boolean isEnum()boolean isInterface()boolean isInstance(Object obj) ,此方法是Java语言 instanceof 运算符的动态等价物 public boolean isLocalClass() // 类是不是本地类。本地类,就是定义在方法内部的类。public boolean isMemberClass() // 当且仅当基础类是成员类时才返回truepublic native boolean isPrimitive() // 类是不是“基本类型”,包括void和8个基本类型public boolean isSynthetic() // 如果此类是合成类,则返回true;否则返回false。为了通过反射操作泛型以迎合实际开发的需要,Java 新增了 java.lang.reflect.ParameterizedType、java.lang.reflect.GenericArrayType、java.lang.reflect.TypeVariable、java.lang.reflect.WildcardType 几种类型来代表不能归一到 Class 类型但是又和原始类型同样重要的类型。
ParameterizedType: 一种参数化类型,比如CollectionGenericArrayType: 一种元素类型是参数化类型或者类型变量的数组类型TypeVariable: 各种类型变量的公共接口WildcardType: 一种通配符类型表达式,如?、? extends Number、? super Integer1 | // 获取类的"annotationClass"类型的注解 (包括从基类继承的、从接口实现的所有public成员变量) |
当我们从类中获取了一个方法后,我们就可以用 invoke() 方法来调用这个方法。invoke() 方法的原型为:
1 | public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException |
代码示例:
1 | public class Test { |
数组在 Java 里是比较特殊的一种类型,它可以赋值给一个 Object Reference。下面我们看一看利用反射创建数组的例子:
1 | public class Test { |
其中的 Array 类为 java.lang.reflect.Array 类。我们通过 Array.newInstance() 创建数组对象,而 newArray 方法是一个 native 方法,它的原型是:
1 | public static Object newInstance(Class<?> componentType, int length) throws NegativeArraySizeException { |
由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。
另外,反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
反射作用:
优点:
缺点:
1、 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的? (多选)
A、Java反射主要涉及的类如Class, Method, Filed,等,他们都在java.lang.reflet包下
B、通过反射可以动态的实现一个接口,形成一个新的类, 并可以用这个类创建对象, 调用对象方法
C、通过反射, 可以突破Java语言提供的对象成员, 类成员的保护机制, 访问一般方式不能访问的成员
D、Java反射机制提供了字节码修改的技术, 可以动态的修剪一个类
解释
1、Class类在java.lang下
2、这是java的动态代理特性
3、反射可以更改类的访问限制;private、protect等关键字是编译期的定义
4、反射可以新增类,但不能修改本身存在的类的字节码
5、通过反射可以调用私有方法
答案:AD