Java 反射

万物皆对象,关于反射的一些整理。 类与对象 // Foo类 class Foo { public void sum(int a, int b) { System.out.println(a + b); } } // Foo类的一个实例对象foo Foo foo = new Foo(); 万物皆对象,类也是个对象。foo是Foo的实例对象,那么Foo又是谁的实例对象呢? 是java.lang.Class的对象。任何一个类都是其对象。 那么,怎么表示这个类的实例对象呢? // 1. 第一种表示方式 -> 任何一个类都有一个叫class的静态成员变量 Class c1 = Foo.class; // 2. 第二种表示方式 -> 通过该类的实例对象拿到 Class c2 = foo.getClass; // 3. 第三种表示方式 Class c3 = Class.forName("com.xu42.java.Foo"); 一种通过类的类类型创建类的实例对象的方式 // 可以通过类的类类型(class type)来创建类的实例对象 Foo foo = (Foo) c1.newInstance();//需要Foo拥有无参数的构造方法 java.lang.Class常用的一些方法 // 获取foo实例的public方法(包含父类) Method[] methods = c2.getMethods(); // 获取foo实例的所有方法(不包含父类) Method[] methods = c2.……

阅读全文

Java Jar包运行参数

Java程序编译为Jar包后,使用nohup java [-options] -jar jarfile > LOG_FILE 2>&1 &来后台运行。 本文主要是options参数的配置简单讲解。 假设我们的应用依赖的JDK版本是1.8 假设我们的虚拟机的内存是4196MB(可通过free -m | awk '/Mem/{print $2}'来查看) -server 选择VM -server -Xms-Xmx-Xmn-Xss 设置初始 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置最大 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置年轻代大小,推荐设置为Xms的3/8,这里是768m 设置 Java 线程堆栈大小,建议256k 详解可以参考这篇文章 -Xms2048m -Xmx2048m -Xmn768m -Xss256k -XX:MetaspaceSize=-XX:MaxMetaspaceSize= XX:MetaspaceSize=推荐设置为Xms的1/4 XX:MaxMetaspaceSize=推荐设置为Xms的1/2 这对参数的详解,可以参考下这篇文章 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:SurvivorRatio Eden区与Survivor区的大小比值,推荐8 其他,未完待续………

阅读全文

设计模式学习 - 策略模式

学习、梳理设计模式。 策略模式 由策略接口、多个具体的策略实现、上下文组成。由客户端来选择具体的策略实现。 一个背景,CRM系统内有多种帐号体系:手机号注册的客户、微信授权的客户、微博授权的客户。 一个场景,需要把这些不同帐号体系的ID转换为CRM系统内部的统一UserId。 策略接口及实现 策略接口 public interface UserStrategy { long transform2UserId(String origin); } 手机号客户实现 public class MobileUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 1L; } } 微信客户实现 public class OpenIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 3L; } } 微博客户实现 public class WeiBoIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 2L; } } 上下文 public class UserContext { private UserStrategy userStrategy; public UserContext(UserStrategy userStrategy) { this.……

阅读全文

设计模式学习 - 工厂模式

学习、梳理设计模式。 工厂模式 工厂方法模式 根据不同的对象,提供不同的工厂,然后由客户端来选择对应的工厂。这也是与简单工厂模式的不同的地方。 人 接口 public interface People { void speek(); } 男孩 public class Boy implements People { @Override public void speek() { System.out.println("boy"); } } 女孩 public class Girl implements People { @Override public void speek() { System.out.println("girl"); } } 人 工厂 public interface PeopleFactory { People getPeople(); } 男孩 工厂 public class BoyFactory implements PeopleFactory { @Override public People getPeople() { return new Boy(); } } 女孩 工厂……

阅读全文

设计模式学习 - 适配器模式

学习、梳理设计模式。 适配器模式 不兼容的转换为兼容的,为解决兼容问题而生。 实现方式可分为组合方式和继承方式。 举个例子,充电宝只能用二相电供电,但现在只有三相电该怎么办呢? 三相电实例 /** * 三相电 */ public class ThreePlug { public void powerWithThree() { System.out.println("使用三相供电"); } } 二相电接口 /** * 二相接口 */ public interface TwoPlugInterface { /** * 二相电流供电 */ void powerWithTwo(); } 充电宝 /** * 充电宝 */ public class PowerBank { /** * 需要二相供电 */ private TwoPlugInterface twoPlugInterface; public PowerBank(TwoPlugInterface twoPlugInterface) { this.twoPlugInterface = twoPlugInterface; } public void power() { twoPlugInterface.powerWithTwo(); } } 组合方式 我们来定义个三相适配器(接收三相电,对外提供二相电)。……

阅读全文

设计模式学习 - 模版方法模式

学习、梳理设计模式。 模版方法模式 模版方法模式,以继承的方式来实现,提升代码的复用性,适合具有相同或相似的步骤的逻辑处理。 由抽象基类和具体子类来具体实现。 抽象基类 具体的逻辑抽象为几个步骤,具有相同步骤的可以抽象为基本方法,不同的可以抽象为抽象方法,对于有个性化需求的(比如不是所有步骤都需要的)可以用钩子来进行控制,最后是组合这些步骤的模版方法。 基本方法 抽象方法 可选钩子(Hook) 模版方法(final) /** * 宠物基类 */ public abstract class AbstracthPet { /** * 喂食 */ public final void feedingTemplate() { //1. buyFood(); //2. cook(); //3. pourInDish(); if (isAddMilk()) { //4. addMilk(); } } protected boolean isAddMilk() { return true; } private void buyFood() { System.out.println("1. 买粮"); } protected abstract void cook(); private void pourInDish() { System.out.println("3. 倒入盘子"); } private void addMilk() { System.……

阅读全文

设计模式学习 - 单例模式

学习、梳理设计模式。 单例模式 单例模式分为饿汉模式和懒汉模式。 饿汉模式 私有化构造函数 创建私有实例 提供公开的获取实例的方法 public class Person { private static Person instance = new Person(); private Person() { } public static Person getInstance() { return instance; } } 懒汉模式 私有化构造函数 声明私有实例 提供公开的获取实例的方法(获取时为空则进行创建) public class Person { private static Person instace; private Person() { } public static Person getInstance() { if (instace == null) { return new Person(); } return instace; } } 总结 两种模式都需要先私有化构造函数以禁止直接new操作来创建实例,不然就失去了单例的意义。……

阅读全文

有赞云GoLang版SDK 非官方

前段时间看了些GoLang的资料,要上手熟悉就得造轮子,so.. 造了个GoLang版本的有赞云SDK。 Talk is cheap. Show me the code… GitHub: https://github.com/xu42/youzan-sdk-go GoDoc: https://godoc.org/github.com/xu42/youzan-sdk-go GoLang写出来确实简洁,总共也没多少行代码… 使用 这里仅举例获取Token和调用示例API 生成Token package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { // 获取自用型AccessToken resp, err := youzan.GenSelfToken("CLIENT_ID", "CLIENT_SECRET", "110") fmt.Println(resp, resp.AccessToken, err) // 获取自用型AccessToken resp1, err1 := youzan.GenToolToken("CLIENT_ID", "CLIENT_SECRET", "CODE", "URI") fmt.Println(resp1, resp1.AccessToken, err1) } 调用API package main import ( "fmt" "github.com/xu42/youzan-sdk-go" ) func main() { params := map[string]string{ "page_no": "1", "page_size": "10", } result, err := youzan.……

阅读全文

Go couldn't start listener listen tcp lookup localhost no such host

使用GoLang进行debug时, 报了这么个错couldn't start listener: listen tcp: lookup localhost: no such host 其实很简单,是因为本地的hosts文件少配置了127.0.0.1 localhost 为什么少了这行配置?可能是其他开发时切换了hosts配置而刚好那个配置没有加这一行 添加这一行后如果没有生效,记得清一下缓存 (hugo的文章标题竟然不能带标点符号:…) End………

阅读全文

Go vet composite literal uses unkeyed fields

在使用go vet进行语法检查时, 报了这么个错composite literal uses unkeyed fields 对于刚开始看Golang的我一脸懵逼, 明明是可以编译通过且跑通的… struct 是这样定义的 type CallRequest struct { AccessToken string APIName string APIVersion string APIParams map[string]string } 代码里是这样用的 // ... 省略 ... request := CallRequest{accessToken, apiName, apiVersion, params} 然后 go vet ./... 就报错了... composite literal uses unkeyed fields 看了些资料后知道了, 这样写更严谨一些: request := CallRequest{AccessToken: accessToken, APIName: apiName, APIVersion: apiVersion, APIParams: params} End………

阅读全文