首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

(4)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务发现和消费

上一章说了 Consul服务注册 现在我要连接上Consul里面的服务 请求它们的API接口 应该怎么做呢? 1.找Consul要一台你需要的服务器 1.1 获取Consul下的所有注册的服务 using (var consulClient = new ConsulClient(c => c.Address = new Uri("http://127.0.0.1:8500"))) { var services = consulClient.Agent.Services().Result.Response; foreach(var service in services.Values) { Console.WriteLine($"id={service.ID},name={service.Service},ip={service.Address},port={service.Port}"); } } 1.2 随机取一个Name为MsgService的服务 下面的代码使用当前 TickCount 进行取模的方式达到随机获取一台服务器实例的效果,这叫做“客户端负载均衡”: using (var consulClient = new ConsulClient(c => c.Address = new Uri("http://127.0.0.1:8500"))) { var services = consulClient.Agent.Services().Result.Response.Values.Where(s => s.Service.Equals("MsgService", StringComparison.OrdinalIgnoreCase)); if(!services.Any()) { Console.WriteLine("找不到服务的实例"); } else { var service = services.ElementAt(Environment.TickCount%services.Count()); Console.WriteLine($"{service.Address}:{service.Port}"); } } 当然在一个毫秒之类会所有请求都压给一台服务器,基本就够用了。也可以自己写随机、轮询等客户端负载均衡算法,也可以自己实现按不同权重分配(注册时候 Tags 带上配置、权重等信息)等算法。 2.请求服务器的接口 你拿到了http地址 难道还不会请求接口么 找个httphelper 直接请求就好了 如果还是不会 就来群里问吧 群号:608188505 给大家上一个 我常用的httphelper 可能被我该的不像样了 不过相信大家都会用 不会的话 来群里找我吧。 1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.IO; 5 using System.IO.Compression; 6 using System.Linq; 7 using System.Net; 8 using System.Net.Security; 9 using System.Runtime.InteropServices; 10 using System.Security.Cryptography.X509Certificates; 11 using System.Text; 12 using System.Text.RegularExpressions; 13 using System.Threading.Tasks; 14 15 namespace ClientApp 16 {/// <summary> 17 /// Http连接操作帮助类 18 /// </summary> 19 public class HttpHelper 20 { 21 private const int ConnectionLimit = 100; 22 //编码 23 private Encoding _encoding = Encoding.Default; 24 //浏览器类型 25 private string[] _useragents = new string[]{ 26 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36", 27 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)", 28 "Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0", 29 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20130401 Firefox/31.0" 30 }; 31 32 private String _useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"; 33 //接受类型 34 private String _accept = "text/html, application/xhtml+xml, application/xml, */*"; 35 //超时时间 36 private int _timeout = 30 * 1000; 37 //类型 38 private string _contenttype = "application/x-www-form-urlencoded"; 39 //cookies 40 private String _cookies = ""; 41 //cookies 42 private CookieCollection _cookiecollection; 43 //custom heads 44 private Dictionary<string, string> _headers = new Dictionary<string, string>(); 45 46 public HttpHelper() 47 { 48 _headers.Clear(); 49 //随机一个useragent 50 _useragent = _useragents[new Random().Next(0, _useragents.Length)]; 51 //解决性能问题? 52 ServicePointManager.DefaultConnectionLimit = ConnectionLimit; 53 } 54 55 public void InitCookie() 56 { 57 _cookies = ""; 58 _cookiecollection = null; 59 _headers.Clear(); 60 } 61 62 /// <summary> 63 /// 设置当前编码 64 /// </summary> 65 /// <param name="en"></param> 66 public void SetEncoding(Encoding en) 67 { 68 _encoding = en; 69 } 70 71 /// <summary> 72 /// 设置UserAgent 73 /// </summary> 74 /// <param name="ua"></param> 75 public void SetUserAgent(String ua) 76 { 77 _useragent = ua; 78 } 79 80 public void RandUserAgent() 81 { 82 _useragent = _useragents[new Random().Next(0, _useragents.Length)]; 83 } 84 85 public void SetCookiesString(string c) 86 { 87 _cookies = c; 88 } 89 90 /// <summary> 91 /// 设置超时时间 92 /// </summary> 93 /// <param name="sec"></param> 94 public void SetTimeOut(int msec) 95 { 96 _timeout = msec; 97 } 98 99 public void SetContentType(String type) 100 { 101 _contenttype = type; 102 } 103 104 public void SetAccept(String accept) 105 { 106 _accept = accept; 107 } 108 109 /// <summary> 110 /// 添加自定义头 111 /// </summary> 112 /// <param name="key"></param> 113 /// <param name="ctx"></param> 114 public void AddHeader(String key, String ctx) 115 { 116 //_headers.Add(key,ctx); 117 _headers[key] = ctx; 118 } 119 120 /// <summary> 121 /// 清空自定义头 122 /// </summary> 123 public void ClearHeader() 124 { 125 _headers.Clear(); 126 } 127 128 /// <summary> 129 /// 获取HTTP返回的内容 130 /// </summary> 131 /// <param name="response"></param> 132 /// <returns></returns> 133 private String GetStringFromResponse(HttpWebResponse response) 134 { 135 String html = ""; 136 try 137 { 138 Stream stream = response.GetResponseStream(); 139 StreamReader sr = new StreamReader(stream, Encoding.UTF8); 140 html = sr.ReadToEnd(); 141 142 sr.Close(); 143 stream.Close(); 144 } 145 catch (Exception e) 146 { 147 Trace.WriteLine("GetStringFromResponse Error: " + e.Message); 148 } 149 150 return html; 151 } 152 153 /// <summary> 154 /// 检测证书 155 /// </summary> 156 /// <param name="sender"></param> 157 /// <param name="certificate"></param> 158 /// <param name="chain"></param> 159 /// <param name="errors"></param> 160 /// <returns></returns> 161 private bool CheckCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) 162 { 163 return true; 164 } 165 166 /// <summary> 167 /// 发送GET请求 168 /// </summary> 169 /// <param name="url"></param> 170 /// <returns></returns> 171 public String HttpGet(String url) 172 { 173 return HttpGet(url, url); 174 } 175 176 177 /// <summary> 178 /// 发送GET请求 179 /// </summary> 180 /// <param name="url"></param> 181 /// <param name="refer"></param> 182 /// <returns></returns> 183 public String HttpGet(String url, String refer) 184 { 185 String html; 186 try 187 { 188 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate); 189 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 190 request.UserAgent = _useragent; 191 request.Timeout = _timeout; 192 request.ContentType = _contenttype; 193 request.Accept = _accept; 194 request.Method = "GET"; 195 request.Referer = refer; 196 request.KeepAlive = true; 197 request.AllowAutoRedirect = true; 198 request.UnsafeAuthenticatedConnectionSharing = true; 199 request.CookieContainer = new CookieContainer(); 200 //据说能提高性能 201 //request.Proxy = null; 202 if (_cookiecollection != null) 203 { 204 foreach (Cookie c in _cookiecollection) 205 { 206 c.Domain = request.Host; 207 } 208 209 request.CookieContainer.Add(_cookiecollection); 210 } 211 212 foreach (KeyValuePair<String, String> hd in _headers) 213 { 214 request.Headers[hd.Key] = hd.Value; 215 } 216 217 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 218 html = GetStringFromResponse(response); 219 if (request.CookieContainer != null) 220 { 221 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri); 222 } 223 224 if (response.Cookies != null) 225 { 226 _cookiecollection = response.Cookies; 227 } 228 if (response.Headers["Set-Cookie"] != null) 229 { 230 string tmpcookie = response.Headers["Set-Cookie"]; 231 _cookiecollection.Add(ConvertCookieString(tmpcookie)); 232 } 233 234 response.Close(); 235 return html; 236 } 237 catch (Exception e) 238 { 239 Trace.WriteLine("HttpGet Error: " + e.Message); 240 return String.Empty; 241 } 242 } 243 244 /// <summary> 245 /// 获取MINE文件 246 /// </summary> 247 /// <param name="url"></param> 248 /// <returns></returns> 249 public Byte[] HttpGetMine(String url) 250 { 251 Byte[] mine = null; 252 try 253 { 254 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate); 255 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 256 request.UserAgent = _useragent; 257 request.Timeout = _timeout; 258 request.ContentType = _contenttype; 259 request.Accept = _accept; 260 request.Method = "GET"; 261 request.Referer = url; 262 request.KeepAlive = true; 263 request.AllowAutoRedirect = true; 264 request.UnsafeAuthenticatedConnectionSharing = true; 265 request.CookieContainer = new CookieContainer(); 266 //据说能提高性能 267 request.Proxy = null; 268 if (_cookiecollection != null) 269 { 270 foreach (Cookie c in _cookiecollection) 271 c.Domain = request.Host; 272 request.CookieContainer.Add(_cookiecollection); 273 } 274 275 foreach (KeyValuePair<String, String> hd in _headers) 276 { 277 request.Headers[hd.Key] = hd.Value; 278 } 279 280 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 281 Stream stream = response.GetResponseStream(); 282 MemoryStream ms = new MemoryStream(); 283 284 byte[] b = new byte[1024]; 285 while (true) 286 { 287 int s = stream.Read(b, 0, b.Length); 288 ms.Write(b, 0, s); 289 if (s == 0 || s < b.Length) 290 { 291 break; 292 } 293 } 294 mine = ms.ToArray(); 295 ms.Close(); 296 297 if (request.CookieContainer != null) 298 { 299 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri); 300 } 301 302 if (response.Cookies != null) 303 { 304 _cookiecollection = response.Cookies; 305 } 306 if (response.Headers["Set-Cookie"] != null) 307 { 308 _cookies = response.Headers["Set-Cookie"]; 309 } 310 311 stream.Close(); 312 stream.Dispose(); 313 response.Close(); 314 return mine; 315 } 316 catch (Exception e) 317 { 318 Trace.WriteLine("HttpGetMine Error: " + e.Message); 319 return null; 320 } 321 } 322 323 /// <summary> 324 /// 发送POST请求 325 /// </summary> 326 /// <param name="url"></param> 327 /// <param name="data"></param> 328 /// <returns></returns> 329 public String HttpPost(String url, String data) 330 { 331 return HttpPost(url, data, url,null); 332 } 333 334 /// <summary> 335 /// 发送POST请求 336 /// </summary> 337 /// <param name="url"></param> 338 /// <param name="data"></param> 339 /// <param name="refer"></param> 340 /// <returns></returns> 341 public String HttpPost(String url, String data, String refer,string cookie) 342 { 343 String html; 344 try 345 { 346 ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckCertificate); 347 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 348 request.UserAgent = _useragent; 349 request.Timeout = _timeout; 350 request.Referer = refer; 351 request.ContentType = _contenttype; 352 request.Accept = _accept; 353 request.Method = "POST"; 354 request.KeepAlive = true; 355 request.AllowAutoRedirect = true; 356 357 request.CookieContainer = new CookieContainer(); 358 if (!string.IsNullOrEmpty(cookie)) 359 { 360 _cookiecollection = this.ConvertCookieString(cookie); 361 } 362 //据说能提高性能 363 request.Proxy = null; 364 365 if (_cookiecollection != null) 366 { 367 foreach (Cookie c in _cookiecollection) 368 { 369 c.Domain = request.Host; 370 if (c.Domain.IndexOf(':') > 0) 371 c.Domain = c.Domain.Remove(c.Domain.IndexOf(':')); 372 } 373 request.CookieContainer.Add(_cookiecollection); 374 } 375 376 foreach (KeyValuePair<String, String> hd in _headers) 377 { 378 request.Headers[hd.Key] = hd.Value; 379 } 380 byte[] buffer = _encoding.GetBytes(data.Trim()); 381 request.ContentLength = buffer.Length; 382 request.GetRequestStream().Write(buffer, 0, buffer.Length); 383 request.GetRequestStream().Close(); 384 385 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 386 html = GetStringFromResponse(response); 387 if (request.CookieContainer != null) 388 { 389 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri); 390 } 391 if (response.Cookies != null) 392 { 393 _cookiecollection = response.Cookies; 394 } 395 if (response.Headers["Set-Cookie"] != null) 396 { 397 string tmpcookie = response.Headers["Set-Cookie"]; 398 _cookiecollection.Add(ConvertCookieString(tmpcookie)); 399 } 400 401 response.Close(); 402 return html; 403 } 404 catch (Exception e) 405 { 406 Trace.WriteLine("HttpPost Error: " + e.Message); 407 return String.Empty; 408 } 409 } 410 411 412 public string UrlEncode(string str) 413 { 414 StringBuilder sb = new StringBuilder(); 415 byte[] byStr = _encoding.GetBytes(str); 416 for (int i = 0; i < byStr.Length; i++) 417 { 418 sb.Append(@"%" + Convert.ToString(byStr[i], 16)); 419 } 420 421 return (sb.ToString()); 422 } 423 424 /// <summary> 425 /// 转换cookie字符串到CookieCollection 426 /// </summary> 427 /// <param name="ck"></param> 428 /// <returns></returns> 429 private CookieCollection ConvertCookieString(string ck) 430 { 431 CookieCollection cc = new CookieCollection(); 432 string[] cookiesarray = ck.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 433 for (int i = 0; i < cookiesarray.Length; i++) 434 { 435 string[] cookiesarray_2 = cookiesarray[i].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 436 for (int j = 0; j < cookiesarray_2.Length; j++) 437 { 438 string[] cookiesarray_3 = cookiesarray_2[j].Trim().Split("=".ToCharArray()); 439 if (cookiesarray_3.Length == 2) 440 { 441 string cname = cookiesarray_3[0].Trim(); 442 string cvalue = cookiesarray_3[1].Trim(); 443 if (cname.ToLower() != "domain" && cname.ToLower() != "path" && cname.ToLower() != "expires") 444 { 445 Cookie c = new Cookie(cname, cvalue); 446 cc.Add(c); 447 } 448 } 449 } 450 } 451 452 return cc; 453 } 454 455 456 public void DebugCookies() 457 { 458 Trace.WriteLine("**********************BEGIN COOKIES*************************"); 459 foreach (Cookie c in _cookiecollection) 460 { 461 Trace.WriteLine(c.Name + "=" + c.Value); 462 Trace.WriteLine("Path=" + c.Path); 463 Trace.WriteLine("Domain=" + c.Domain); 464 } 465 Trace.WriteLine("**********************END COOKIES*************************"); 466 } 467 468 } 469 } Httphelper 小哥哥 小姐姐们 如果本篇文章对你们有帮助的话 就点点右下角的推荐吧 0.0 现在的努力只是为了更好的将来,将来你一定不会后悔你现在的努力。一起加油吧!!! C#/.NetCore技术交流群:608188505欢迎加群交流 如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

优秀的个人博客,低调大师

java学习笔记--常用类(System,Runtime,date类, Math 数学类,Random 随机数类 )

System类 System.arraycopy(srcArr, 1, destArr, 0,4); 重要 数组间赋值 集合的时候会用到 System.exit(0)正常退出 非0 异常退出 一般都是tyr中exit(0) catch中 exit(非0) System.currentTimeMillis()当前的系统时间 从1971开始 的毫秒单位 重要 System.gc() 建议jvm赶快启动垃圾回收期回收垃圾。 (调用回收机制前会启动对象的finalize的方法 ) Properties xx=System.getProperties(); 需要import java.util.Properties; xx.list(System.out);显示的是系统的属性 String name=System.getProperty(“os.name”); System.out.println(name);根据系统的属性名获取对应的属性值 String name1=System.getenv(“JAVA_Home”); System.out.println(name1);根据环境变量的名字获取环境变量。 Runtime RunTime 该类类主要代表了应用程序运行的环境。 getRuntime() 返回当前应用程序的运行环境对象。 exec(String command) 根据指定的路径执行对应的可执行文件。 freeMemory() 返回 Java 虚拟机中的空闲内存量。。 以字节为单位 maxMemory() 返回 Java 虚拟机试图使用的最大内存量。 totalMemory() 返回 Java 虚拟机中的内存总量 Runtime runtime = Runtime.getRuntime(); // Process process = runtime.exec("C:\\Windows\\notepad.exe");要抛出异常 // Thread.sleep(3000); //让当前程序停止3秒。 // process.destroy(); System.out.println(" Java虚拟机中的空闲内存量。"+runtime.freeMemory()); System.out.println("Java 虚拟机试图使用的最大内存量:"+ runtime.maxMemory()); System.out.println("返回 Java 虚拟机中的内存总量:"+ runtime.totalMemory()); date类: 如果需要知道当前时间的某个时间段 那需要Calendar 没有构造函数 调用getInstance就行(是静态的函数) 本来是date.getYear()但是被Calendar给替代了 如果是获取时间段的一部分就用Calendar而不是date 例子: Calendar calendar = Calendar.getInstance(); //获取当前的系统时间。 System.out.println("年:"+ calendar.get(Calendar.YEAR)); System.out.println("月:"+ (calendar.get(Calendar.MONTH)+1)); System.out.println("日:"+ calendar.get(Calendar.DATE)); “` System.out.println(“时:”+ calendar.get(Calendar.HOUR_OF_DAY)); System.out.println(“分:” + calendar.get(Calendar.MINUTE)); System.out.println(“秒:”+ calendar.get(Calendar.SECOND)); 如果要将指定的时间转换为指定的显示方式就用 SimpleDateFormat * 日期格式化类 SimpleDateFormat * 作用1: 可以把日期转换转指定格式的字符串 format() * 作用2: 可以把一个 字符转换成对应的日期。 parse() 生日 * */ Date date = new Date(); //获取当前的系统时间。 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss") ; //使用了默认的格式创建了一个日期格式化对象。 String time = dateFormat.format(date); //可以把日期转换转指定格式的字符串 System.out.println("当前的系统时间:"+ time); String birthday = "2000年12月26日 11:29:08"; Date date2 = dateFormat.parse(birthday); //注意: 指定的字符串格式必须要与SimpleDateFormat的模式要一致。 System.out.println(date2); “` Math 数学类, 主要是提供了很多的数学公式。 abs(double a) 获取绝对值 ceil(double a) 向上取整 floor(double a) 向下取整 round(float a) 四舍五入 random() 产生一个随机数. 大于等于 0.0 且小于 1.0 的伪随机 double 值 随机数类 Random 需求: 编写一个函数随机产生四位的验证码。 Random random = new Random(); int randomNum = random.nextInt(10)+1; //产生 的 随机数就是0-10之间 System.out.println("随机数:"+ randomNum); char[] arr = {'中','国','传','a','Q','f','B'}; StringBuilder sb = new StringBuilder(); Random random = new Random(); //需要四个随机数,通过随机数获取字符数组中的字符, for(int i = 0 ; i< 4 ; i++){ int index = random.nextInt(arr.length); //产生的 随机数必须是数组的索引值范围之内的。 sb.append(arr[index]); } System.out.println("验证码:"+ sb);

优秀的个人博客,低调大师

(ElasticsSearch学习)歌词检索Demo的实现:二. 搭建spring boot+spring data+jest+elasti...

1.说明 本文主要讲解如何使用Spring Boot快速搭建Web框架,结合Spring Data 和 Jest 快速实现对阿里云ElasticSearch的全文检索功能。主要使用组件:Spring Boot Starter:可以帮助我们快速的搭建spring mvc 环境Jest:一种rest访问es的客户端elasticsearch:全文检索spring data elasticsearch:结合spring datathymeleaf:web前端模版框架jquery:js框架bootstrap:前端样式框架 2.项目Maven配置 以下为项目Maven配置,尤其需要注意各个组件的版本,以及注释部分。各个组件的某些版本组合下回出现各种异常,以下maven为测试可通过的一个版本。 <?xml version="1.0" encod

优秀的个人博客,低调大师

重新学习Java语言(一)--Java语言的标识符和关键字

一、标识符 1、什么是标识符? Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符. 标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。 2、标识符的构成 标识符是没有长度限制的由Java字母和数字构成的序列,其中首字母必须是Java字母 "Java字母" 是作为参数调用Character.isJavaIdentifierStart(int)方法时返回true的字符 "Java字母或数字" 是作为参数调用 Character.isJavaIdentifierPart(int)方法时返回true的字符 "Java字母"包括大写和小写的ASCII拉丁字母A~Z ( \u0041 ~ \u005a )和 a~z (\u0061 ~ \u007a ),并且由于历史原因还包括下划线 (_ 或 \u005f) 和美元符号( $ 或 \u0024 )。$符号应该仅出现在机器生成的源代码中,或者用于另一种函件的情况,即访问遗留系统中已有的名字。 "Java数字"包括ASCII数字0~9(\u0030 ~ \u0039) 例子: package com.yy.test; /** * Created by anyang on 2018/1/4. */ public class Class_2018_01_04_01 { public static void 挖到(){ System.out.println("我是汉字"); } public static void Á(){ //注意:这是两个字符,是希腊字母A和一个无空格上提号 复制下来退格就能清楚的看到了(非空格标记) System.out.println("我是字母A和无空格间隙的上提号组合"); } public static void Á(){ System.out.println("我是希腊字母"); } public enum test{ 我是DJ, 我不是DJ, 我到底是不是DJ } public static void main(String[] args) { 挖到(); System.out.println(Character.isJavaIdentifierPart(97)); System.out.println("代码点值是: "+(int)'_'); } } 如上例,看似完全相同的 Á和 Á 却有着天壤之别。 3、 使用标识符应该注意 标识符的拼写不能与关键字、布尔字面常量、空字面常量或编译时发生的错误的拼写相同 两个标识符只有在拼写完全相同,即每个对应的Unicode字母或者数字都相同的时候才会被认为是相同的标识符。具有相同外观的标识符仍旧有可能是不同的。 二、关键字 1、关键字都有哪些 Java保留了50个关键字,他们都是由ASCII字母构成的字符序列,并且不能当做标识符使用,他们包括: abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while 2、其他注意事项 尽管现在已经不再使用关键字const和goto了,但仍旧保留了。这使得当这些C++关键字在程序中使用不当时,Java编译器能够产生更有用的错误消息 尽管true和false看起来应该被当做关键字,但从技术上讲,他们仅仅只是布尔字面常量。与此类似null看起来也应该被当做关键字,但他也仅仅只是空字面常量。 三、关于Character.isJavaIdentifierPart(int) /** * Determines if the character (Unicode code point) may be part of a Java * identifier as other than the first character. * <p> * A character may be part of a Java identifier if any of the following * are true: * <ul> * <li> it is a letter 字母组合(单词) * <li> it is a currency symbol (such as {@code '$'}) 货币符号如:美元符号 * <li> it is a connecting punctuation character (such as {@code '_'}) 连接标点字符如:下划线 * <li> it is a digit 数字 * <li> it is a numeric letter (such as a Roman numeral character) 数字字母如:罗马数字等 * <li> it is a combining mark 结合字符(举例说明) * <li> it is a non-spacing mark 非空格标记(举例说明) * <li> {@link #isIdentifierIgnorable(int) * isIdentifierIgnorable(codePoint)} returns {@code true} for * the character * </ul> * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character may be part of a * Java identifier; {@code false} otherwise. * @see Character#isIdentifierIgnorable(int) * @see Character#isJavaIdentifierStart(int) * @see Character#isLetterOrDigit(int) * @see Character#isUnicodeIdentifierPart(int) * @see javax.lang.model.SourceVersion#isIdentifier(CharSequence) * @since 1.5 */ public static boolean isJavaIdentifierPart(int codePoint) { return CharacterData.of(codePoint).isJavaIdentifierPart(codePoint); } package java.lang; abstract class CharacterData { abstract int getProperties(int ch); abstract int getType(int ch); abstract boolean isWhitespace(int ch); abstract boolean isMirrored(int ch); abstract boolean isJavaIdentifierStart(int ch); abstract boolean isJavaIdentifierPart(int ch); abstract boolean isUnicodeIdentifierStart(int ch); abstract boolean isUnicodeIdentifierPart(int ch); abstract boolean isIdentifierIgnorable(int ch); abstract int toLowerCase(int ch); abstract int toUpperCase(int ch); abstract int toTitleCase(int ch); abstract int digit(int ch, int radix); abstract int getNumericValue(int ch); abstract byte getDirectionality(int ch); //need to implement for JSR204 int toUpperCaseEx(int ch) { return toUpperCase(ch); } char[] toUpperCaseCharArray(int ch) { return null; } boolean isOtherLowercase(int ch) { return false; } boolean isOtherUppercase(int ch) { return false; } boolean isOtherAlphabetic(int ch) { return false; } boolean isIdeographic(int ch) { return false; } // Character <= 0xff (basic latin) is handled by internal fast-path // to avoid initializing large tables. // Note: performance of this "fast-path" code may be sub-optimal // in negative cases for some accessors due to complicated ranges. // Should revisit after optimization of table initialization. static final CharacterData of(int ch) { if (ch >>> 8 == 0) { // fast-path return CharacterDataLatin1.instance; } else { switch(ch >>> 16) { //plane 00-16 case(0): return CharacterData00.instance; case(1): return CharacterData01.instance; case(2): return CharacterData02.instance; case(14): return CharacterData0E.instance; case(15): // Private Use case(16): // Private Use return CharacterDataPrivateUse.instance; default: return CharacterDataUndefined.instance; } } } } //假设传参获得的实例是 CharacterData00 的 那么接下来就有 boolean isJavaIdentifierPart(int ch) { int props = getProperties(ch); return ((props & 0x00003000) != 0); } int getProperties(int ch) { char offset = (char)ch; int props = A[Y[X[offset>>5]|((offset>>1)&0xF)]|(offset&0x1)]; return props; } 参考资料:http://blog.csdn.net/mazhimazh/article/details/17708001 https://www.zhihu.com/question/20552606 https://baike.baidu.com/item/java%E6%A0%87%E8%AF%86%E7%AC%A6/11010420?fr=aladdin http://utf8.supfree.net/ 说明:本文大部分引用自《Java语言规范-基于Java SE 8》

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册