Java 常用套路(持续更新)

灌水文章,勿喷。实例中的代码有的直接来源于网上,已经忘了从哪里摘抄过来了。囧~~~~~~

访问私有变量

field.setAccessible(true);
BlockingQueue<EmailObj> quue =  (BlockingQueue<EmailObj>)field.get(emailManager);
EmailObj emailObj = quue.take();

反射修改类方法权限

Method method = DeployTask.class.getDeclaredMethod("getDeployHosts", SubTask.class);
method.setAccessible(true);
String deployHost = (String) method.invoke(deployTask, subTask);
Assert.assertEquals(deployHost, host + Constants.SPLIT_FLAG + "0");

Jackson 数据反射

反射为 HashMap 类型

TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(HashMap.class, String.class, Theme.class);
HashMap<String, Theme> map = mapper.readValue(json, mapType);

同样的,我们应该可以使用 Jackson 提供相关类对例如 LinkedListSet 这些集合类型进行反射。具体请见 Deserializing into a HashMap of custom objects with jackson

读取classes目录下的文件

File file = new File(loader.getResource("admin.pub").getFile());

将 stacktrace 输出到日志文件

StringWriter trace = new StringWriter();
e.printStackTrace(new PrintWriter(trace));
logger.error(trace.toString());

格式化时间

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()

读取InputStream里面的内容

使用Apache commons IOUtils类,下面这些方法的限制是指针对本地文件,对于TCP的input stream并不适用。

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

// 更加鸡贼的写法是
String theString = IOUtils.toString(inputStream, encoding);

// 对于Spring用户,可以使用如下的代码
import java.nio.charset.StandardCharsets;
import org.springframework.util.FileCopyUtils;

public String convertStreamToString(InputStream is) throws IOException { 
    return new String(FileCopyUtils.copyToByteArray(is), StandardCharsets.UTF_8);
}

long to timesptamp

long time = System.currentMilliseconds();
new Timestamp(time);

发送Http请求

GET
public static String httpGet(String requestUrl, Map<String, String> headers) throws IOException {
    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(requestUrl);

    for (String key: headers.keySet()) {
        get.setHeader(key, headers.get(key));
    }

    HttpResponse responseGet = client.execute(get);
    HttpEntity resEntityGet = responseGet.getEntity();

    return EntityUtils.toString(resEntityGet);
}
POST
public static String postJson(String address, Map<String, String> headers) {
    try {
        URL url = new URL(address);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        return IOUtils.toString(connection.getInputStream(), "UTF-8");
    } catch (MalformedURLException e) {
        logger.error("address: " + address, e);
    } catch (IOException e) {
        logger.error("address: " + address, e);
    }
    
    return null;
}

log4j

限制 log4j debug 范围:

log4j.logger.com.datastory.ops.resource=DEBUG, DRFA, CONSOLE

数据结构

一行代码初始化 List
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
一行代码初始化 Map
ImmutableMap.of("cookie", RConfig.getInstance().get(RConstant.DEPLOY_TOKEN))

Gson

如何序列化/反序列化 abstract class

先创建一个 adapter 序列化 abstract class,在本例子中, adapter 里面调用了 Result 的 serialize 方法,将 Result 序列化。

import com.google.gson.*;

import java.lang.reflect.Type;

/**
 * Created by zhuohui on 17/6/26.
 */
public class ResultAdapter implements JsonSerializer, JsonDeserializer {
    public JsonElement serialize(Object src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        Result result = (Result) src;
        result.serialize(jsonObject);
        return jsonObject;
    }

    @Override
    public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject object = json.getAsJsonObject();
        String type = object.get("type").getAsString();
        Result output = ResultFactory.createResult(type);
        output.deserialize(object);
        return output;
    }
}

然后在创建 Gson 对象之前,注册 Result.class 的 adapter,注意使用 registerTypeHierarchyAdapter 方法,才能够对 Result.class 的所有子类生效

new GsonBuilder()
    .registerTypeHierarchyAdapter(Result.class, new ResultAdapter())
    .create()
    .toJson(report)
如何反序列话 List of objects
Type listType = new TypeToken<List<GraphHistory>>(){}.getType();
List<GraphHistory> histories = new Gson().fromJson(json, listType);

单例

静态内部类实现的单例:

public class Singleton {  
    private static class SingletonHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
        return SingletonHolder.INSTANCE; 
    }  
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,639评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,277评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,221评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,474评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,570评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,816评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,957评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,718评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,176评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,511评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,646评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,322评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,934评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,755评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,987评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,358评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,514评论 2 348

推荐阅读更多精彩内容

  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 1,967评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 936评论 0 1
  • 我把石头扔进了霓虹灯下的沟渠 沟渠里的红红绿绿被砸成了碎片 日出的时候所有的霓虹灯光都消失了 没有人知道我在沟渠边...
    留子尧阅读 212评论 2 8