Java --- class reflection (2) -- class reflection enhancement

Familiar with memory 2021-01-21 16:00:30
java class reflection class reflection


After a previous blog ,Java— Class reflection (1), I believe you have a certain understanding of class reflection . Let's strengthen class reflection , Learn how to use class reflection to new An object , How to access the methods of other classes through class reflection . How to access the member variables of other classes through class reflection .

You might think that private methods of a class , Private member variables are inaccessible to other classes . however , Class reflection can be accessed through brute force access .

also : Finally, we need to simulate Java The function of introspection

Class ( Calling members in a class )

* Construct class objects

Use the constructor to create a new object . Find the corresponding constructor according to the specified parameter type , Pass in the corresponding parameters to call the execution , To create a new object instance .

Code example Person Class code :

package cn.hncu.reflect;
import java.io.IOException;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class Person extends Parent {
String name;
private int age;
public int num;
public static String schoolName;
public Person() {
this("naName", 0);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(int age) throws IOException, NumberFormatException {
this("naName", age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
protected void setAge(int age) {
this.age = age;
}
private int sum(int a) {
return 0;
}
private int sum() {
return 0;
}
int aa(String a, int b) throws IOException, NumberFormatException {
return 0;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", num=" + num + "]";
}
}
class Parent{
public static final int N=100;
}

Construct class objects :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* Demonstration of class reflection
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
operateConstructor(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* One 、 demonstration : Use the constructor to create a new object
* @param classFileName
* @throws ReflectiveOperationException
*/
private static void operateConstructor(String classFileName) throws ReflectiveOperationException {
Class cls = Class.forName(CLASS_FILE_NAME);
//1 Use of nonparametric construction method ---- Simple and most used in the future
//Object obj = cls.newInstance();
//2 The use of parametric construction method
// Execute in the way of class reflection Object obj = new Person("Jack",20);
//2.1 Get specified " Parameter list type " Constructor ---Constructor object
Class parameterTypes[] = new Class[2];
parameterTypes[0] = String.class;
parameterTypes[1] = int.class;
Constructor con= cls.getConstructor(parameterTypes);//※1※
//2.2 Call the constructor to new object
Object initargs[] = new Object[2];
initargs[0] = new String("Jack");
initargs[1] = new Integer(20);
Object resultObj = con.newInstance(initargs);//※2※
System.out.println(resultObj);
}
}

Output results :

Person [name=Jack, age=20, num=0]

* Calling method

Execute method based on method name . Matches the specified method based on the method name and parameter type , Pass in the corresponding parameters and objects to call and execute . If it's a static method , You do not need to pass in a specific object .

Code example :

Person Or before Person class …

demonstration : Call a parameterless normal method :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* Demonstration of class reflection
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
callMethod(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* Two 、 demonstration : Call a parameterless normal method
* @param classFileName
* @throws ReflectiveOperationException
*/
private static void callMethod(String classFileName) throws ReflectiveOperationException{
Class cls = Class.forName(CLASS_FILE_NAME);
// demand : Calling the null parameter method p.toString()
//1.1 You have to use a class object
Object obj = cls.newInstance();
//1.2 Adjust method with object
//1.2.1 Get the corresponding method first Method object
Method m = cls.getMethod("toString", null);
//1.2.2 use obj and method To call the method
Object returnValue = m.invoke(obj, null);
System.out.println(returnValue);
}
}

Output results :

Person [name=naName, age=0, num=0]

demonstration : Call a normal method with parameters

Person Compared with before , Added a double sum(int , double) Method .

public double sum( int n, double d){
double sum =0;
for(int i=1;i<=n;i++){
sum +=d;
}
return sum;
}

Demo class :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* Demonstration of class reflection
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
callMethod2(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* 3、 ... and 、 demonstration : Call a normal method with parameters
* @param classFileName
* @throws ReflectiveOperationException
*/
private static void callMethod2(String classFileName) throws ReflectiveOperationException{
Class cls = Class.forName(CLASS_FILE_NAME);
// demand : Call the parameterized method p.sum(10,2.34)
//1.1 You have to use a class object
Object obj = cls.newInstance();
//**1.2 Adjust method with object
//***1.2.1 Get the corresponding method first Method object
Class parameterTypes[] = new Class[2];// Parameter list --- Type list ---Class Array
//paramTypes[0]=int.class;//OK
parameterTypes[0]=Integer.TYPE;//OK
//paramTypes[0]=Integer.class;//ERROR: because Integer.class The corresponding is Integer type , No int type . and Integer.TYPE Refer to int type
parameterTypes[1]=double.class;
Method method = cls.getMethod("sum", parameterTypes);
//***1.2.2 use obj and method To call the method
Object[] args = new Object[2];
args[0] = 10;
args[1] = 2.34;
Object returnObj = method.invoke(obj, args);
System.out.println(returnObj);
}
}

Output results :

23.4

demonstration : Call static methods

Person Class adds a static method show();

public static void show(){
System.out.println("show.........");
}

Demo class :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
/**
* Demonstration of class reflection
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
callMethod3(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* Four 、 demonstration : Call static methods --- You don't need an object to adjust , The rest is the same as the normal method
* @param classFileName
* @throws ReflectiveOperationException
*/
private static void callMethod3(String classFileName) throws ReflectiveOperationException{
Class cls = Class.forName(CLASS_FILE_NAME);
// call static show();
Method methed = cls.getMethod("show", null);
methed.invoke(null, null);
}
}

Output results :

show.........

* Getting and setting property values

Read and modify the value of a property according to its name , To access non static properties, you need to pass in an object as a parameter .

Code example :

Person Or the previous class ;

Now let's look at the demo class :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Demonstration of class reflection
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
changeFieldValue(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* 5、 ... and 、 Shows how to read and modify the value of a property based on its name
* @param classFileName
* @throws ReflectiveOperationException
*/
private static void changeFieldValue(String classFileName) throws ReflectiveOperationException{
Class cls = Class.forName(CLASS_FILE_NAME);
// demand : To set a value for a property of an object , Such as : p.num=123
//1.1 You have to use a class object
Object obj = cls.newInstance();
//1.2 Sets the specified property of the object
//1.2.1 Get the corresponding one first Field object
Field field = cls.getField("num");// get attribute “num” Corresponding Field object
// Setting property values
field.set(obj, 1234);
// Read property values
System.out.println(field.getInt(obj));//1234---- The return is int type , If the data type is clear , This is better
System.out.println(field.get(obj));//1234---- The return is Object type , It's universal
Person p = new Person();
p.num=999;
System.out.println(field.getInt(p));//999,new Who tune who
}
}

Brute force access to private methods of other classes , Private member variables , Private constructor :

Person Class adds a private method :abc();

 private int abc(){
System.out.println("abc....");
return 10;
}

Demo violence interview :

package cn.hncu.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Class reflection violence to access the demonstration of other classes
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class ReflectOperateObj {
private static final String CLASS_FILE_NAME="cn.hncu.reflect.Person";
public static void main(String[] args) {
try {
brokeAccess(CLASS_FILE_NAME);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
/**
* 6、 ... and 、 demonstration : Violent visits
* @param classFileName
*/
private static void brokeAccess(String classFileName) throws ReflectiveOperationException{
Class cls = Class.forName(CLASS_FILE_NAME);
Object obj = cls.newInstance();
// visit Person The method of private ownership abc()
Method m = cls.getDeclaredMethod("abc",null);
// Just turn on the access switch , Then you can visit violently
m.setAccessible(true);
Object returnObj = m.invoke(obj, null);
System.out.println("returnObj= "+returnObj);
//*************
// Knowledge about violence visit
// In fact, you need to call before you visit. AccessibleObject Class setAccessible() Method and pass in boolean Type variable
// and AccessibleObject Class is Constructor、Field and Method The parent of three classes , As a result, all three can conduct violent interviews !
}
}

Output results :

abc....
returnObj= 10

see , Is it time to visit . Even if your class is private , Same access , Isn't it amazing , O(∩_∩)O ha-ha ~.

practice ( simulation Java The function of introspection )

* preparation Define a Model class , All the attributes in it are private Of , Then provide the getter and setter Method ; Prepare another one Map,map Of key Values are string representations of property fields in a class , Arbitrary value .

Model class : UserModel :

package cn.hncu.reflect.myBeanUtils;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class UserModel {
private String uuid;
private String name;
private int age;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserModel other = (UserModel) obj;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
@Override
public String toString() {
return "UserModel [uuid=" + uuid + ", name=" + name + ", age=" + age
+ "]";
}
}

bookModel:

package cn.hncu.reflect.myBeanUtils;
public class bookModel {
private String uuid;
private String name;
private double inPrice;
private double outPrice;
private int num;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getInPrice() {
return inPrice;
}
public void setInPrice(double inPrice) {
this.inPrice = inPrice;
}
public double getOutPrice() {
return outPrice;
}
public void setOutPrice(double outPrice) {
this.outPrice = outPrice;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
bookModel other = (bookModel) obj;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
@Override
public String toString() {
return "bookModel [uuid=" + uuid + ", name=" + name + ", inPrice="
+ inPrice + ", outPrice=" + outPrice + ", num=" + num + "]";
}
}

* Real work Design a method Object getModel(Map map,Class cls), Pass in a string containing all the values Map, And then pass in Model Class class, Then the return Model Class , This instance already contains all the relevant data . That is the Map The data in is reflected , Set back to Model In the class instance .

No generic ( One ): MyBeanUtils

package cn.hncu.reflect.myBeanUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
/**
*
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class MyBeanUtils {
public static Object populate(Class cls,Map map) throws ReflectiveOperationException{
Object obj =null;
//1 Using class reflection new Object out
obj = (Object) cls.newInstance();
//2 Using the reflection of the same kind to evaluate the new new Sets the property value of the object ( Must abide by the Java Set the specification )-- That is, through setter Method setting
//2.1 Traverse all the declared properties of this class
Field fields[] = cls.getDeclaredFields();
for(Field fld : fields){
// Get the fld Object represents the name of the property
String fldName = fld.getName();
// According to the property name , To map To read data , You need to set a value for this property only if the data is not empty
Object mapValue = map.get(fldName);
if(mapValue==null){
// If map There is no corresponding attribute data in , We'll give you a hint here
System.out.println(fldName+" The data of is empty !");
}else{
// If map There is corresponding attribute data in , The attribute name is used to get its value setter The name of the method
String setName = "set"+fldName.substring(0, 1).toUpperCase()+fldName.substring(1);
// Depending on the method name and the data type of the parameter ( It's actually the type of attribute ), get Method object
Class parameterTypes[] =new Class[1];
parameterTypes[0] = fld.getType();
Method method = cls.getDeclaredMethod(setName, parameterTypes);// It's better not to use it getMethod, Because this may use the method of the parent class
// There's no need to worry about accessing private data , Because the authority was not released .
// Call the method The method represented by the object
Object args[] = new Object[1];
args[0] = mapValue;
method.invoke(obj, args);
}
}
return obj;
}
}

Test class :

package cn.hncu.reflect.myBeanUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class Client {
public static void main(String[] args) {
test1();
}
private static void test1() {
Map map = new HashMap();
map.put("uuid", "X001");
map.put("name", " Armin ");
map.put("age", 123);
try {
Object userModel = MyBeanUtils.populate(UserModel.class, map);
System.out.println(userModel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}

// All the values are set for this test . Output results :

UserModel [uuid=X001, name= Armin , age=123]

It is also possible that the test data is incomplete . We have written an output here ( In order to see clearly ), In the actual , It doesn't need output .

package cn.hncu.reflect.myBeanUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class Client {
public static void main(String[] args) {
test2();
}
private static void test2() {
Map map = new HashMap();
map.put("uuid", "X001");
map.put("name", " Armin ");
try {
Object userModel = MyBeanUtils.populate(UserModel.class, map);
System.out.println(userModel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}

Output results :

age The data of is empty !
UserModel [uuid=X001, name= Armin , age=0]

In order to make that class universal , We also tested it bookModel class :

package cn.hncu.reflect.myBeanUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class Client {
public static void main(String[] args) {
test3();
}
private static void test3() {
Map map = new HashMap();
map.put("uuid", "001");
map.put("name", " A dream of red mansions ");
map.put("inPrice", 20.5);
map.put("num", 123);
try {
Object bookModel = MyBeanUtils.populate(bookModel.class, map);
System.out.println(bookModel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}

Again , One of the data is incomplete , Output results :

outPrice The data of is empty !
bookModel [uuid=001, name= A dream of red mansions , inPrice=20.5, outPrice=0.0, num=123]

If you complete the data :

private static void test3() {
Map map = new HashMap();
map.put("uuid", "001");
map.put("name", " A dream of red mansions ");
map.put("inPrice", 20.5);
// Data not previously available ---outPrice, Now fill in
map.put("outPrice", 50.5);
map.put("num", 123);
try {
Object bookModel = MyBeanUtils.populate(bookModel.class, map);
System.out.println(bookModel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}

Output results :

bookModel [uuid=001, name= A dream of red mansions , inPrice=20.5, outPrice=50.5, num=123]

Okay , The test passed completely . It's just that tool class has a strong turn , It doesn't seem very good , What shall I do? . This is the time , You can use generics .

Here's the version using generics , As for testing , I'll just test it once .

package cn.hncu.reflect.myBeanUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
public class MyBeanUtils2 {
public static <T>T populate(Class<T> cls,Map<String, Object> map) throws ReflectiveOperationException{
T t = null;
//1 Using class reflection new Object out
t = cls.newInstance();
//2 Using the reflection of the same kind to evaluate the new new Sets the property value of the object ( Must abide by the Java Set the specification )-- That is, through setter Method setting
//2.1 Traverse all the declared properties of this class
Field flds[] = cls.getDeclaredFields();
for(Field fld:flds){
// Get the fld Object represents the name of the property
String fldName = fld.getName();
Object mapV = map.get(fldName);
// According to the property name , To map To read data , You need to set a value for this property only if the data is not empty
if(mapV==null){
// If map There is no corresponding attribute data in , We'll give you a hint here
System.out.println(fldName+" Data is empty !");
}else{
// If map There is corresponding attribute data in , The attribute name is used to get its value setter The name of the method
String setName = "set"+fldName.substring(0,1).toUpperCase()+fldName.substring(1);
// Depending on the method name and the data type of the parameter ( It's actually the type of attribute ), get Method object
Class parameterTypes[] = new Class[1];
parameterTypes[0] = fld.getType();
Method m = cls.getDeclaredMethod(setName, parameterTypes);
// Call the method The method represented by the object
Object args[] = new Object[1];
args[0]=mapV;
m.invoke(t, args);
}
}
return t;
}
}

Test class :

package cn.hncu.reflect.myBeanUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @author Chen Haoxiang
*
* @version 1.0 2016-5-2
*/
public class Client {
public static void main(String[] args) {
test4();
}
private static void test4() {
Map map = new HashMap();
map.put("uuid", "001");
map.put("name", " A dream of red mansions ");
map.put("inPrice", 20.5);
//map.put("outPrice", 50.5);
map.put("num", 123);
try {
Object bookModel = MyBeanUtils2.populate(bookModel.class, map);
System.out.println(bookModel);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}

The output is :

outPrice Data is empty !
bookModel [uuid=001, name= A dream of red mansions , inPrice=20.5, outPrice=0.0, num=123]

Okay , Class reflection is that all . The end! . In fact, it's very easy to reflect like this , That is, through the complete class name , Call again newInstance Method new An object . And then through this object to operate the method Method, Construction method ( Call the constructor to new object Object initargs[] = new Object[2]; initargs[0] = new String(“Jack”); initargs[1] = new Integer(20); Object resultObj = con.newInstance(initargs);), Member variables Field. To access private , Just turn on the access switch , Then you can visit violently That is to say .setAccessible(true); Method , Set to true.

Participation of this paper Tencent cloud media sharing plan , You are welcome to join us , share .

版权声明
本文为[Familiar with memory]所创,转载请带上原文链接,感谢
https://javamana.com/2021/01/20210121155638323D.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云