Java reflection นั้นง่าย
ชวาのการสะท้อนส่วนนี้จะแนะนำคลาสยูทิลิตี้ที่ช่วยให้ใช้งาน API ได้ง่ายขึ้น
การสะท้อนคืออะไร?
API การสะท้อนฟัน,"java.lang.reflectมีรวมอยู่ในแพ็คเกจแล้ว
API นี้ใช้สำหรับดึงข้อมูล เช่น ฟิลด์และเมธอดจากคลาส Java
เราจะใช้คลาสต่อไปนี้เป็นหลัก
- คลาส java.lang
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- ฟิลด์ java.lang.reflect
การสะท้อนด้วยวิธีนี้ คุณสามารถหลีกเลี่ยงการเขียนโค้ดสร้างคลาสและการเรียกใช้เมธอดโดยตรงได้
คุณสามารถสร้างอินสแตนซ์ของคลาสและเรียกใช้เมธอดจากสตริงได้
การกำหนดชื่อคลาสและชื่อเมธอดในไฟล์ภายนอก เช่น XML ช่วยให้แอปพลิเคชันสามารถปรับเปลี่ยนได้อย่างไดนามิกตามการเปลี่ยนแปลงในสภาพแวดล้อมการทำงาน
นอกจากนี้ ยังเป็น API ที่มีประสิทธิภาพสูงมากสำหรับการสร้างแอปพลิเคชันที่มีความยืดหยุ่นสูง
จุดประสงค์ของการไตร่ตรอง
การสะท้อนแม้ว่าผู้ใช้จะไม่ได้ใช้งานโดยตรงบ่อยนักก็ตาม
มีการใช้งานอย่างแพร่หลายในแอปพลิเคชันบนเว็บ เช่น Struts และในเฟรมเวิร์กต่างๆ เช่น O/R mapping
ตัวอย่างเช่น เมื่อคุณต้องการตั้งค่าข้อมูลที่ป้อนจากหน้าจอเว็บลงในคุณสมบัติของ JavaBeans โดยอัตโนมัติ
ตัวอย่างเช่น จะใช้ในการออกคำสั่ง SQL เพื่ออัปเดตคุณสมบัติของ JavaBeans โดยอัตโนมัติ
นอกจากนี้ ยังมีฟีเจอร์ต่างๆ เช่น การโหลดและลงทะเบียนปลั๊กอินแบบไดนามิก ซึ่งจะช่วยเพิ่มฟังก์ชันการทำงานของแอปพลิเคชันเมื่อเริ่มต้นทำงานการสะท้อนสิ่งนี้สามารถทำได้ง่ายๆ โดยใช้ [วิธีการนี้]
กำลังดำเนินการตัวอย่าง
ตอนนี้ โปรดลองรันโค้ดตัวอย่างและสัมผัสประสบการณ์การเขียนโปรแกรมโดยใช้เฟรมเวิร์กด้วยตัวคุณเอง
ในที่นี้เราจะใช้คลาสต่อไปนี้การสะท้อนนี่คือวิธีการใช้งานยูทิลิตี้อย่างง่าย
เมน.จาวา...คลาสที่จะดำเนินการ
BeanUtil.java...คลาสยูทิลิตี้การสะท้อน
ฟรีซอฟต์.จาวา...นี่คือคลาสที่แสดงถึงซอฟต์แวร์โอเพนซอร์สและใช้เป็นเครื่องมือสะท้อนความคิด
●เมื่อดำเนินการตามปกติ
FreeSoft freeSoft = new FreeSoft();
ฟรีซอฟต์.ตั้งค่าชื่อ(แชทและส่งข้อความ - มีแชทและส่งข้อความด้วย!!)“);
freeSoft.showName();
freeSoft.showPrice(0);
●เมื่อดำเนินการโดยใช้การสะท้อน (reflection)
// สร้างอินสแตนซ์ของคลาส FreeSoft
Object invokeObject = BeanUtil.newInstance("ฟรีซอฟต์")“);
// กำหนดค่าให้กับช่องชื่อ
BeanUtil.setProperty(invokeObject, “"ชื่อ"” , “"แชทและส่งข้อความ - แชทและส่งข้อความได้ด้วย!!"”);
// เรียกใช้เมธอด showName() ของ FreeSoft
BeanUtil.invoke(invokeObject, “แสดงชื่อ”, โมฆะ);
// เรียกใช้เมธอด showPrice() ของ FreeSoft
// หากเมธอดมีอาร์กิวเมนต์ จะต้องส่งอาร์กิวเมนต์เหล่านั้นเป็นอาร์เรย์ของชนิด Object
BeanUtil.invoke(invokeObject, “แสดงราคา”,new Object[]{new Integer(0)});
●ผลลัพธ์การดำเนินการ
ผลลัพธ์ของการดำเนินการจะเหมือนกันไม่ว่าคุณจะใช้ Reflection หรือไม่ก็ตาม
ชื่อซอฟต์แวร์: Chat&Messenger โปรแกรมแชทและส่งข้อความ!
ราคา: 0 เยน
>>>เมื่อใช้การสะท้อน
ชื่อซอฟต์แวร์: Chat&Messenger โปรแกรมแชทและส่งข้อความ!
ราคา: 0 เยน
รายละเอียดวิธีการ BeanUtil
อินสแตนซ์ใหม่
วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(String className) โยนข้อยกเว้น
- ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส- ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วน- ค่าที่ส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
- ข้อยกเว้น:
ข้อยกเว้น
อินสแตนซ์ใหม่
วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(String className, Object[] argObj) โยนข้อยกเว้น
- ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส- ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วนอาร์กออบเจ– อาร์กิวเมนต์ของคอนสตรัคเตอร์- ค่าที่ส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
- ข้อยกเว้น:
ข้อยกเว้น
อินสแตนซ์ใหม่
วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(คลาส clazz) โยนข้อยกเว้น
- ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
คลาซซ์- ระดับ- ค่าที่ส่งคืน:
- คลาสใหม่
- ข้อยกเว้น:
ข้อยกเว้น
อินสแตนซ์ใหม่
วัตถุสาธารณะคงที่ อินสแตนซ์ใหม่(คลาส clazz, Object[] argObj) โยนข้อยกเว้น
- ฟังก์ชันนี้จะสร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
คลาซซ์- ระดับอาร์กออบเจ– อาร์กิวเมนต์ของคอนสตรัคเตอร์- ค่าที่ส่งคืน:
- คลาสใหม่
- ข้อยกเว้น:
ข้อยกเว้น
ตั้งค่าคุณสมบัติ
สาธารณะ คงที่ ว่างเปล่า ตั้งค่าคุณสมบัติ(Object invokeObject, String fieldName, Object value) โยนข้อยกเว้น
- มีการเรียกเมธอด setter ของฟิลด์ "fieldName" ของอ็อบเจ็กต์ "invokeObject" เพื่อเก็บค่า "value"
หากไม่มีเมธอด setter ค่าจะถูกกำหนดให้กับฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็น public
-
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลชื่อฟิลด์– ชื่อคุณสมบัติของวัตถุที่จะถูกดำเนินการที่แนะนำ– ค่าที่จะตั้งค่า- ข้อยกเว้น:
ข้อยกเว้น– เกิดข้อยกเว้นดังต่อไปนี้:InvocationTargetException- เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาดข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง– อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้NosuchMethodException- หากไม่พบเมธอดที่มีชื่อตามที่ระบุ
รับคุณสมบัติ
วัตถุสาธารณะคงที่ รับคุณสมบัติ(Object invokeObject, String fieldName) โยนข้อยกเว้น
- เมธอด getter ของ fieldName ของอ็อบเจ็กต์ invokeObject จะถูกเรียกเพื่อดึงค่าของมัน
หากไม่มีเมธอด getter ค่าจะถูกดึงมาจากฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของพร็อพเพอร์ตี้เป้าหมายจะต้องเป็น public -
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลชื่อฟิลด์– ชื่อคุณสมบัติของวัตถุที่จะถูกดำเนินการ- ค่าที่ส่งคืน:
- ค่าที่ส่งคืนจากเมธอด getter
- ข้อยกเว้น:
ข้อยกเว้น– เกิดข้อยกเว้นดังต่อไปนี้:InvocationTargetException- เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาดข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง– อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้NosuchFieldException- หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ
เรียกใช้
วัตถุสาธารณะคงที่ เรียกใช้(Object invokeObject, String callMethod, Object[] argObjects) โยนข้อยกเว้น InvocationTargetException, IllegalAccessException, NoSuchMethodException
- คำสั่งนี้จะเรียกใช้เมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"
ถ้ามีค่าส่งคืน สามารถรับค่าดังกล่าวได้ในรูปแบบของอ็อบเจ็กต์ -
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลเรียกเมธอด– ชื่อของเมธอดที่จะถูกเรียกใช้งานอาร์กออบเจกต์– หากมีการส่งอาร์กิวเมนต์ จะส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีการส่งอาร์กิวเมนต์ จะส่งค่า null แทน- ค่าที่ส่งคืน:
- ค่าที่ส่งคืนจากการเรียกใช้เมธอด "callMethod"
- ข้อยกเว้น:
InvocationTargetException- เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาดข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง– อ็อบเจ็กต์ Method นี้เป็นของ Java
หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้NosuchMethodException- หากไม่พบเมธอดที่มีชื่อตามที่ระบุ
ค้นหาเมธอด
เมธอดสาธารณะแบบคงที่ ค้นหาเมธอด(Object invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
- คำสั่งนี้จะค้นหาเมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"
-
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลเรียกเมธอด– ชื่อของเมธอดของอ็อบเจ็กต์ที่จะถูกเรียกใช้งานอาร์กออบเจกต์– หากมีการส่งอาร์กิวเมนต์ จะส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีการส่งอาร์กิวเมนต์ จะส่งค่า null แทน- ค่าที่ส่งคืน:
- อ็อบเจ็กต์เมธอดที่ตรงกับเงื่อนไขของอาร์กิวเมนต์ที่ระบุ
- ข้อยกเว้น:
NosuchMethodException- หากไม่พบวิธีการที่ตรงกัน หรือหากชื่อเป็น "" หรือ ""
ตั้งค่าฟิลด์
สาธารณะ คงที่ ว่างเปล่า ตั้งค่าฟิลด์(Object invokeObject, String fieldName, Object value) โยนข้อยกเว้น IllegalAccessException, NoSuchFieldException
- ค่า "value" จะถูกเก็บไว้ในฟิลด์ชื่อ "fieldName" ของอ็อบเจ็กต์ "invokeObject" ที่จะถูกเรียกใช้งาน
-
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลชื่อฟิลด์– ชื่อฟิลด์ของวัตถุที่จะถูกดำเนินการที่แนะนำ– ค่าที่จะตั้งค่า- ข้อยกเว้น:
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง– วัตถุที่ระบุคือฟิลด์พื้นฐาน (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศไว้ หรือหากการแปลงค่าล้มเหลวNosuchFieldException- หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ
รับฟิลด์
วัตถุสาธารณะคงที่ รับฟิลด์(Object invokeObject, String fieldName) โยนข้อยกเว้น IllegalAccessException, NoSuchFieldException
- คำสั่งนี้จะดึงค่าของฟิลด์ชื่อ "fieldName" ของอ็อบเจ็กต์ "invokeObject" ที่กำลังถูกเรียกใช้งาน
-
- พารามิเตอร์:
เรียกใช้ออบเจ็กต์- วัตถุที่จะถูกประมวลผลชื่อฟิลด์– ชื่อฟิลด์ของวัตถุที่จะถูกดำเนินการ- ค่าที่ส่งคืน:
- ค่าส่งคืน
- ข้อยกเว้น:
ข้อผิดพลาดการเข้าถึงที่ไม่ถูกต้อง– วัตถุที่ระบุคือฟิลด์พื้นฐาน (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศไว้ หรือหากการแปลงค่าล้มเหลวNosuchFieldException- หากไม่พบช่องข้อมูลที่มีชื่อตามที่ระบุ
มีฟิลด์
บูลีนคงที่สาธารณะ มีฟิลด์(Object object, String fieldName) โยนข้อยกเว้น
- คำสั่งนี้จะตรวจสอบว่าอ็อบเจ็กต์ "object" ได้ประกาศฟิลด์ชื่อ "fieldName" หรือไม่
-
- พารามิเตอร์:
วัตถุ- วัตถุที่จะต้องตรวจสอบชื่อฟิลด์– ชื่อของพื้นที่ที่จะตรวจสอบ- ค่าที่ส่งคืน:
- ถ้าประกาศไว้ จะเป็นความจริง
- ข้อยกเว้น:
ข้อยกเว้น
GETALLFields
public static java.util.TreeSet GETALLFields(Object object) โยนข้อยกเว้น
-
- พารามิเตอร์:
วัตถุ–- ค่าที่ส่งคืน:
- ข้อยกเว้น:
ข้อยกเว้น
getShortClassName
สตริงแบบคงที่สาธารณะ getShortClassName(วัตถุ วัตถุ)
- ฟังก์ชันนี้จะดึงชื่อคลาสที่ไม่ระบุคุณสมบัติจากอ็อบเจ็กต์
-
- พารามิเตอร์:
วัตถุ–- ค่าที่ส่งคืน:
getShortClassName
สตริงแบบคงที่สาธารณะ getShortClassName(ชื่อคลาสสตริง)
- ฟังก์ชันนี้จะดึงชื่อคลาสจากชื่อที่ระบุอย่างครบถ้วน
-
- พารามิเตอร์:
ชื่อคลาส–- ค่าที่ส่งคืน:
GETFieldName
สตริงแบบคงที่สาธารณะ GETFieldName(ชื่อเมธอดสตริง)
- เปลี่ยนชื่อฟิลด์จากชื่อเมธอด ต้องเป็นไปตามข้อกำหนดของ JavaBeans
-
- พารามิเตอร์:
ชื่อข้อมูล–- ค่าที่ส่งคืน:
คลาสมีอยู่จริง
บูลีนคงที่สาธารณะ คลาสมีอยู่จริง(ชื่อคลาสสตริง)
- คำสั่งนี้จะตรวจสอบว่าชื่อเต็ม "className" เป็นชื่อคลาสที่มีอยู่จริงหรือไม่
-
- พารามิเตอร์:
ชื่อคลาส–- ค่าที่ส่งคืน:
รับคำอธิบายคุณสมบัติ
สาธารณะ static PropertyDescriptor[] รับคำอธิบายคุณสมบัติ(Object object) โยน IntrospectionException
- ฟังก์ชันนี้จะส่งคืน PropertyDescriptor ที่เก็บข้อมูลของวัตถุ "object"
-
- พารามิเตอร์:
วัตถุ–- ค่าที่ส่งคืน:
- ข้อยกเว้น:
java.beans.IntrospectionException
ซอร์สโค้ดของ BeanUtil
/**
* คลาสยูทิลิตี้ที่ช่วยให้ใช้งาน API การสะท้อน (reflection API) ของ Java ได้ง่ายขึ้น
*/
คลาสสาธารณะ BeanUtil {
/** */
private static final String GET = “GET”;
/** */
private static final String SET = “SET”;
// ———————————————————-『newInstance』
/**
* สร้างและส่งคืนอินสแตนซ์จากสตริง "className"
* @param className ชื่อคลาสแบบเต็ม
* @return อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
* @throws Exception
*/
public static Object newInstance(String className) throws Exception {
พยายาม {
return Class.forName(className).newInstance();
} catch (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError : ” + className);
สามอี;
}
}
/**
* สร้างและส่งคืนอินสแตนซ์จากสตริง "className"
* @param className ชื่อคลาสแบบเต็ม
* @param argObj อาร์กิวเมนต์ของคอนสตรัคเตอร์
* @return อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
* @throws Exception
*/
public static Object newInstance(String className, Object[] argObj)
โยนข้อยกเว้น {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
คอนสตรัคเตอร์ c = Class.forName(className).getConstructor(argClass);
คืนค่า c.newInstance(argObj);
}
/**
* สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
* @param clazz class
* @return อินสแตนซ์ใหม่ของ Sunazz
* @throws Exception
*/
public static Object newInstance(Class clazz) throws Exception {
คืนค่า clazz.newInstance();
}
/**
* สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
* @param clazz class
* @param argObj อาร์กิวเมนต์ของคอนสตรัคเตอร์
* @return อินสแตนซ์ใหม่ของ Sunazz
* @throws Exception
*/
public static Object newInstance(Class clazz, Object[] argObj)
โยนข้อยกเว้น {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
คอนสตรัคเตอร์ c = clazz.getConstructor(argClass);
คืนค่า c.newInstance(argObj);
}
// ---------------------"วิธี"
/**
* เมธอด setter ของฟิลด์ "fieldName" ของอ็อบเจ็กต์ "invokeObject"
* เรียกและจัดเก็บค่า "value"
* <br>
* หากไม่มีเมธอด setter ค่าจะถูกกำหนดให้กับฟิลด์โดยตรง
* อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติดังกล่าวจะต้องเป็นสาธารณะ
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ
* @param value ค่าที่จะตั้ง
* @throws Exception ข้อผิดพลาดต่อไปนี้จะเกิดขึ้น:
* @throws InvocationTargetException เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
* @throws IllegalAccessException อ็อบเจ็กต์เมธอดนี้เป็น Java
* หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
* @throws NoSuchMethodException หากไม่พบเมธอดที่มีชื่อที่ระบุ
*/
public static void setProperty(Object invokeObject, String fieldName,
ค่าของอ็อบเจ็กต์) โยนข้อยกเว้น {
พยายาม {
เมธอด method = searchMethod(invokeObject, fieldName, SET);
Class[] paramClasses = method.getParameterTypes();
Object[] valueArray = null;
ถ้า (paramClasses[0].isInstance(value)) {
// หากอ็อบเจ็กต์ที่กำลังตั้งค่าเป็นคลาสย่อยของคลาสอาร์กิวเมนต์ จะไม่มีการแปลง
valueArray = new Object[] { value };
อื่น {
valueArray = new Object[] { convObject(value, paramClasses[0]
.getName()) };
}
method.invoke(invokeObject, valueArray);
} catch (NoSuchMethodException e) {
พยายาม {
// หากไม่มีเมธอด setter ให้กำหนดค่าให้กับฟิลด์โดยตรง
setField(invokeObject, fieldName, value);
} catch (NoSuchFieldException fe) {
สตริง errorMes = “\nคลาส” + getShortClassName(invokeObject)
+ “ใช้สำหรับฟิลด์ `` + ชื่อฟิลด์ + ``''\n”
"ไม่มีเมธอด setter ที่สามารถเข้าถึงได้ และ"“
+ “ฟิลด์「” + ชื่อฟิลด์
" + "" ก็ไม่ได้เปิดเผยต่อสาธารณะเช่นกัน;
throw new IllegalAccessException(errorMes);
}
}
}
/**
* เมธอด getter ของ fieldName ของอ็อบเจ็กต์ invokeObject
* ดึงค่าการโทรออกมา <br>
* หากไม่มีเมธอด getter ค่าจะถูกดึงมาจากฟิลด์โดยตรง
* อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติดังกล่าวจะต้องเป็นสาธารณะ
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ
* @return ค่าที่ส่งคืนจากเมธอด getter
* @throws Exception ข้อผิดพลาดต่อไปนี้จะเกิดขึ้น:
* @throws InvocationTargetException เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
* @throws IllegalAccessException อ็อบเจ็กต์เมธอดนี้เป็น Java
* หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
public static Object getProperty(Object invokeObject, String fieldName)
โยนข้อยกเว้น {
พยายาม {
Method method = searchMethod(invokeObject, fieldName, GET);
คืนค่าเมธอด invoke(invokeObject, null);
} catch (NoSuchMethodException e) {
ส่งคืนค่า getField(invokeObject, fieldName);
}
}
/**
* เรียกใช้เมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"
* หากมีค่าส่งคืน สามารถรับค่าดังกล่าวได้ในรูปแบบของอ็อบเจ็กต์
* @param invokeObject วัตถุที่จะเรียกใช้
* @param callMethod ชื่อของเมธอดที่จะถูกเรียกใช้งาน
* @param argObjects หากมีอาร์กิวเมนต์ ให้ส่งเป็นอาร์เรย์ของอ็อบเจ็กต์
* หากไม่มีการระบุอาร์กิวเมนต์ใดๆ จะส่งค่า null ไปให้
* @return ค่าที่ส่งคืนจากการเรียกใช้ "callMethod"
* @throws InvocationTargetException เมื่อเมธอดพื้นฐานเกิดข้อผิดพลาด
* @throws IllegalAccessException อ็อบเจ็กต์เมธอดนี้เป็น Java
* หากมีการใช้งานการควบคุมการเข้าถึงภาษา และไม่สามารถเข้าถึงเมธอดพื้นฐานได้
* @throws NoSuchMethodException หากไม่พบเมธอดที่มีชื่อที่ระบุ
*/
public static Object invoke(Object invokeObject, String callMethod,
Object[] argObjects) โยน InvocationTargetException,
IllegalAccessException, NoSuchMethodException {
Method method = findMethod(invokeObject, callMethod, argObjects);
คืนค่าเมธอด invoke(invokeObject, argObjects);
}
/**
* ค้นหาเมธอด "callMethod" ของอ็อบเจ็กต์ "invokeObject"
* @param invokeObject วัตถุที่จะเรียกใช้
* @param callMethod ชื่อของเมธอดของอ็อบเจ็กต์ที่จะถูกเรียกใช้งาน
* @param argObjects หากมีอาร์กิวเมนต์ ให้ส่งเป็นอาร์เรย์ของอ็อบเจ็กต์
* หากไม่มีการระบุอาร์กิวเมนต์ใดๆ จะส่งค่า null ไปให้
* @return อ็อบเจ็กต์ Method ที่ตรงกับเงื่อนไขของอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchMethodException หากไม่พบเมธอดที่ตรงกัน
* หรือชื่อคือ “ " หรือ " "ในกรณีของ
*/
เมธอดสาธารณะแบบคงที่ findMethod(Object invokeObject, String callMethod,
Object[] argObjects) โยนข้อยกเว้น NoSuchMethodException {
คลาส[] paramClasses = null;
Method[] methods = invokeObject.getClass().getMethods();
top: for (int i = 0; i < methods.length; i++) {
ถ้า (methods[i].getName().equals(callMethod)) {
ถ้า (argObjects == null)
&& methods[i].getParameterTypes().length == 0) {
เมธอดส่งคืน[i];
}
ถ้า argObjects เป็นค่าว่าง {
ดำเนินการต่อ;
}
paramClasses = methods[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// ตรวจสอบความถูกต้องของประเภทข้อมูลของรายการพารามิเตอร์และอาร์กิวเมนต์ทั้งหมด
for (int j = 0; j < paramClasses.length; j++) {
คลาส paramClass = paramClasses[j];
Object argObj = argObjects[j];
// ถ้าประเภทอาร์กิวเมนต์เป็นประเภทพื้นฐาน วัตถุอาร์กิวเมนต์
// ไม่ใช่ค่าว่าง แต่เป็นค่าพื้นฐาน
// หรือจะใช้คลาสย่อยใดๆ ของ Number ก็ได้เช่นกัน
ถ้า argObj เป็นค่าว่าง {
ดำเนินการต่อ;
}
ถ้า (paramClass.isPrimitive()
&& (argObj instanceof Number || argObj
.getClass().isPrimitive())) {
ดำเนินการต่อ;
}
ถ้า (paramClass.isInstance(argObj)) {
// หากไม่มีความเข้ากันได้ในการแปลงโดยปริยายระหว่างประเภท ให้ดำเนินการต่อในเมธอดถัดไป
เลื่อนขึ้นด้านบนต่อไป;
}
}
เมธอดส่งคืน[i];
}
}
}
สตริง paramLength = (paramClasses != null) ? จำนวนเต็ม
.toString(paramClasses.length) : “”;
สตริง errorMes = getShortClassName(invokeObject) + "เมธอด"“
+ callMethod + “はありません。” + “[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
throw new NoSuchMethodException(errorMes);
}
// ----------------------"สนาม"
/**
* ค่าของฟิลด์ชื่อ "fieldName" ของอ็อบเจ็กต์ที่จะถูกเรียกใช้ "invokeObject" จะถูกตั้งค่า
* เก็บค่าไว้
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อฟิลด์ของอ็อบเจ็กต์ที่จะถูกเรียกใช้งาน
* @param value ค่าที่จะตั้ง
* @throws IllegalAccessException วัตถุที่ระบุนั้นอิงตาม
* ฟิลด์ (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
* หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศ *
* หรือหากการแปลงแบบแกะห่อล้มเหลว
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
public static void setField(Object invokeObject, String fieldName,
ค่าของอ็อบเจ็กต์) โยนข้อยกเว้นการเข้าถึงที่ไม่ถูกต้อง (IllegalAccessException) และข้อยกเว้นฟิลด์ที่ไม่ถูกต้อง (NoSuchFieldException) {
ฟิลด์ field = searchField(invokeObject, fieldName);
สตริง className = field.getType().getName();
อ็อบเจ็กต์ convObj = null;
ถ้า (field.getType().isInstance(value)) {
convObj = ค่า;
อื่น {
convObj = convObject(value, className);
}
ฟิลด์.set(invokeObject, convObj);
}
/**
* ค่าของชื่อฟิลด์ "fieldName" ของวัตถุที่จะถูกเรียกใช้ "invokeObject"
* ดึงข้อมูลนั้นมา
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อฟิลด์ของอ็อบเจ็กต์ที่จะถูกเรียกใช้งาน
* @return ค่าที่ส่งคืน
* @throws IllegalAccessException วัตถุที่ระบุนั้นอิงตาม
* ฟิลด์ (หรือคลาสย่อยหรือการใช้งานของฟิลด์นั้น)
* หากไม่ใช่ตัวอย่างของคลาสหรืออินเทอร์เฟซที่ประกาศ *
* หรือหากการแปลงแบบแกะห่อล้มเหลว
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
public static Object getField(Object invokeObject, String fieldName)
โยนข้อยกเว้น IllegalAccessException, NoSuchFieldException {
ฟิลด์ field = searchField(invokeObject, fieldName);
คืนค่าฟิลด์ที่เรียกใช้อ็อบเจ็กต์ (invokeObject);
}
/**
* วัตถุ "object" ประกาศชื่อฟิลด์ "fieldName" หรือไม่
* ฉันจะตรวจสอบดู
* @param object วัตถุที่จะตรวจสอบ
* @param fieldName ชื่อของฟิลด์ที่จะตรวจสอบ
* ถ้ามีการประกาศ @return ไว้ ก็จะเป็นจริง
* @throws Exception
*/
public static boolean hasField(Object object, String fieldName)
โยนข้อยกเว้น {
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String _fieldName = props[i].getName();
ถ้า (fieldName.equals(_fieldName)) {
ส่งคืนค่าจริง;
}
}
ส่งคืนค่าเท็จ;
}
/**
*
* @param object
* @กลับ
* @throws Exception
*/
public static TreeSet getAllFields(Object object) throws Exception {
TreeSet fieldSet = new TreeSet();
// รับชื่อคุณสมบัติจากเมธอด
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
สตริง fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// ดึงชื่อคุณสมบัติจากฟิลด์
Field[] fields = object.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
สตริง fieldName = fields[i].getName();
ถ้า (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
ส่งคืน fieldSet;
}
/**
*
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อฟิลด์ของอ็อบเจ็กต์ที่จะถูกเรียกใช้งาน
* @return อ็อบเจ็กต์ Fielded ที่ตรงกับเงื่อนไขของอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
private static Field searchField(Object invokeObject, String fieldName)
โยนข้อยกเว้น NoSuchFieldException {
พยายาม {
return invokeObject.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
// ขอบเขตนี้ได้มาจากชื่อคอลัมน์ของตาราง
fieldName = checkFieldName(fieldName);
Field[] fields = invokeObject.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
ถ้า (fields[i].getName().equalsIgnoreCase(fieldName)) {
ส่งคืนฟิลด์[i];
}
}
throw new NoSuchFieldException(fieldName);
}
}
// ----------------------" คนอื่น "
/**
* ดึงชื่อคลาสที่ไม่ระบุคุณสมบัติจากอ็อบเจ็กต์
* @param object
* @กลับ
*/
public static String getShortClassName(Object object) {
ถ้า (วัตถุ == null) {
ส่งคืนค่า "null"
}
ชื่อสตริง = object.getClass().getName();
ส่งคืนค่า getShortClassName(name);
}
/**
* ดึงชื่อคลาสจากชื่อที่ระบุอย่างครบถ้วน
* @param className
* @กลับ
*/
public static String getShortClassName(String className) {
int index = className.lastIndexOf(“.”);
return className.substring(index + 1);
}
/**
* เปลี่ยนชื่อฟิลด์จากชื่อเมธอด เพื่อให้เป็นไปตามหลักการของ JavaBeans
* นี่เป็นสิ่งจำเป็น
* @param knowledgeName
* @กลับ
*/
public static String getFieldName(String methodName) {
สตริง fieldName = null;
ถ้า (methodName.startsWith(“is”)) {
fieldName = methodName.substring(2);
อื่น {
fieldName = methodName.substring(3);
}
fieldName = convString(fieldName, 0, “L”);
ส่งคืน FieldName;
}
/**
* คำสั่งนี้จะตรวจสอบว่าชื่อเต็ม "className" เป็นชื่อคลาสที่มีอยู่จริงหรือไม่
* @param className
* @กลับ
*/
public static boolean isClassExist(String className) {
พยายาม {
คลาส.forName(className);
ส่งคืนค่าจริง;
} catch (Exception e) {
ส่งคืนค่าเท็จ;
}
}
private final static Map beanInfoCache = new HashMap();
/**
* ส่งคืน PropertyDescriptor ที่เก็บข้อมูลของวัตถุ "object"
* @param object
* @กลับ
* @throws IntrospectionException
*/
public static PropertyDescriptor[] getPropertyDescriptors(Object object)
โยน IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
ถ้า beanInfo เป็นค่าว่าง {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
คืนค่า beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ———————————————『ต่อไปนี้เป็นเมธอดส่วนตัว』
// ————————————————————————–
/**
* เมธอดเข้าถึงสำหรับอาร์กิวเมนต์ fieldName จะถูกค้นหาโดยอิงจาก PropertyDescriptor
* @param invokeObject วัตถุที่จะเรียกใช้
* @param fieldName ชื่อฟิลด์
* @param type เมธอด Getter ⇒ GET เมธอด Getter ⇒ SET
* @return อ็อบเจ็กต์ Method ที่ตรงกับเงื่อนไขของอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchMethodException หากไม่พบเมธอดที่ตรงกัน
* หรือชื่อคือ “ " หรือ " "”
* ในกรณีของ
* @throws IntrospectionException
*/
เมธอดส่วนตัวแบบคงที่ searchMethod(Object invokeObject, String fieldName,
ประเภทสตริง) โยนข้อยกเว้น NoSuchMethodException, IntrospectionException {
ฟังก์ชันเมธอด = null;
fieldName = checkFieldName(fieldName);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.length; i++) {
ชื่อสตริง = props[i].getName();
ถ้า name ไม่เท่ากับ IgnoreCase ของ fieldName {
ดำเนินการต่อ;
}
ถ้า (type.equals(GET)) {
method = props[i].getReadMethod();
อื่น {
method = props[i].getWriteMethod();
}
ถ้า (method == null) {
ดำเนินการต่อ;
}
เมธอดส่งคืน;
}
// หากไม่มีเมธอดดังกล่าว
throw new NoSuchMethodException("คลาสนี้ไม่มีเมธอด")“
+ “(ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก):” + type.toLowerCase()
+ convString(fieldName, 0, “U”) + “()”);
}
/**
* ตรวจสอบว่าฟิลด์ fieldName ที่เป็นอาร์กิวเมนต์นั้นเป็นชื่อคอลัมน์หรือไม่ และถ้าใช่ ก็จะตรวจสอบว่าเป็นชื่อคอลัมน์หรือไม่
* ฉันจะแปลงกลับ
*
* ที่อยู่ไปรษณีย์ ⇒ ที่อยู่ไปรษณีย์ ↓ mailaddress = mailAddress
* @param fieldName ชื่อฟิลด์หรือชื่อคอลัมน์
* @return ชื่อฟิลด์
*/
private static String checkFieldName(String fieldName) {
int index = fieldName.indexOf(“_”);
ในขณะที่ (จริง) {
ถ้า (ดัชนี == -1) {
ส่งคืน FieldName;
}
StringBuffer convcloumn = new StringBuffer(fieldName);
convcloumn.deleteCharAt(index);
fieldName = convcloumn.toString();
index = fieldName.indexOf(“_”);
}
}
/**
* แปลงวัตถุที่จะแปลงให้เป็นประเภทที่ระบุโดย convClassName
*
* @param object วัตถุที่จะแปลง
* @param convClassName สตริงคลาสของประเภทที่จะแปลงไป
* @return อ็อบเจ็กต์ที่แปลงแล้ว
*/
private static Object convObject(Object object, String convClassName) {
ถ้า (วัตถุ == null) {
// การแปลงเป็นชนิดข้อมูลพื้นฐานจะทำให้เกิดข้อผิดพลาดหากค่าที่ส่งกลับเป็น null
// พันรอบ 0
ถ้า (convClassName.equals(“int”)) {
คืนค่าจำนวนเต็มใหม่ (0);
} else if (convClassName.equals(“long”)) {
คืนค่า Long ใหม่ (0);
อื่น {
ส่งคืนค่าว่าง;
}
}
ถ้า (object.getClass().getName().equals(convClassName)) {
ส่งคืนอ็อบเจ็กต์;
}
// —————————————-『 object instanceof String 』
if (object instanceof String) {
ถ้า (convClassName.equals(“java.lang.String”)) {
ส่งคืนอ็อบเจ็กต์;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
สตริง str = อ็อบเจ็กต์ (สตริง);
ถ้า (isExist(str)) {
// มันจะทำงานไม่ถูกต้องหากไม่แปลงเป็น BigDecimal ก่อน
// 1000.00000
BigDecimal big = new BigDecimal(str);
กลับใหม่ยาว(big.longValue());
อื่น {
// ถ้า str เป็นค่าคงที่ของเชลล์ ค่าเริ่มต้นจะเป็น "0"
คืนค่า Long ใหม่ (0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
ส่งคืนค่า toSqlDate((String) object);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
วันที่ = toSqlDate((String) object);
ส่งคืนค่า Timestamp ใหม่ (date.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// ถ้า str เป็นค่าคงที่ของเชลล์ ค่าเริ่มต้นจะเป็น "0"
สตริง str = อ็อบเจ็กต์ (สตริง);
ถ้า (isExist(str)) {
BigDecimal big = new BigDecimal(str);
ส่งคืนค่าจำนวนเต็มใหม่ (big.intValue());
อื่น {
คืนค่าจำนวนเต็มใหม่ (0);
}
} else if (convClassName.equals(“boolean”)) {
return Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
สตริง temp = ((สตริง) object).trim();
// temp.length() == 0の場合0ではなくnullにするのが無難。
if (temp.length() == 0) {
ส่งคืนค่าว่าง;
อื่น {
คืนค่า BigDecimal ใหม่ (temp);
}
}
throwNoSupprt(object, convClassName);
}
// ———————————『 object instanceof java.sql.Date 』
else if (object instanceof java.sql.Date) {
ถ้า (convClassName.equals(“java.lang.String”)) {
ส่งคืนค่า toStringDate((java.sql.Date) object, “yyyy/MM/dd”);
} else if (convClassName.equals(“java.sql.Date”)) {
ส่งคืนอ็อบเจ็กต์;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
คืนค่า Timestamp ใหม่ (((Date) object).getTime());
}
throwNoSupprt(object, convClassName);
}
// ————————————-『 object instanceof Timestamp 』
else if (object instanceof Timestamp) {
เวลานาน = ((Timestamp) object).getTime();
ถ้า (convClassName.equals(“java.lang.String”)) {
ส่งคืนค่า toStringDate(time, “yyyy/MM/dd HH:mm:ss”);
} else if (convClassName.equals(“java.sql.Date”)) {
คืนค่า java.sql.Date ใหม่ (เวลา);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
ส่งคืนอ็อบเจ็กต์;
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof Integer 』
else if (object instanceof Integer) {
ถ้า (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
ส่งคืนอ็อบเจ็กต์;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
return new Long(((Integer) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
ส่งคืนค่า BigDecimal ใหม่ (((Integer) object).intValue());
}
throwNoSupprt(object, convClassName);
}
// ——————————————『 object instanceof Long 』
else if (object instanceof Long) {
ถ้า (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
ส่งคืนอ็อบเจ็กต์;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
ส่งคืนค่าจำนวนเต็มใหม่ (((Long) object).intValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
ส่งคืนค่า BigDecimal ใหม่ (((Long) object).longValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof Double 』
else if (object instanceof Double) {
ถ้า (convClassName.equals(“java.lang.String”)) {
// หมายเลขคอลัมน์ (8,0)
// Windows Oracle > BigDecimal
// UNIX oracle > Double
BigDecimal big = new BigDecimal(((Double) object).doubleValue());
int scale = big.scale();
ถ้า (scale == 0) {
return big.toString();
อื่น {
// ไม่รองรับการปัดเศษหากจำเป็น
throwNoSupprt(object, convClassName);
}
}
ถ้า (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
ส่งคืนค่าจำนวนเต็มใหม่ (((Double) object).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
ส่งคืนค่า Long ใหม่ (((Double) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
ส่งคืนค่า BigDecimal ใหม่ (((Double) object).doubleValue());
}
throwNoSupprt(object, convClassName);
}
// ————————————『 object instanceof BigDecimal 』
else if (object instanceof BigDecimal) {
ถ้า (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
ส่งคืนค่า Long ใหม่ (((BigDecimal) object).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
ส่งคืนค่าจำนวนเต็มใหม่ (((BigDecimal) object).intValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof byte[] 』
else if (object instanceof byte[]) {
ถ้า (convClassName.equals(“java.sql.Blob”)) {
ส่งคืนอ็อบเจ็กต์;
}
throwNoSupprt(object, convClassName);
}
// ————————————————『วัตถุเป็นค่าบูลีน』
else if (object instanceof Boolean) {
ถ้า (convClassName.equals(“boolean”)) {
ส่งคืนอ็อบเจ็กต์;
}
throwNoSupprt(object, convClassName);
}
// ———————————————-『วัตถุเป็นค่าบูลีน[]』
else if (object instanceof boolean[]) {
ถ้า (convClassName.equals(“java.lang.String”)) {
boolean[] bs = (boolean[]) object;
StringBuffer buff = new StringBuffer(“[“);
for (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + ",");
}
buff.deleteCharAt(buff.length() – 1);
บัฟ.อัปเอนด์("]");
return buff.toString();
}
throwNoSupprt(object, convClassName);
}
throwNoSupprt(object, convClassName);
ส่งคืนค่าว่าง;
}
/**
* เกิดข้อผิดพลาดหากไม่รองรับการแปลงไฟล์
*
* @param object วัตถุที่จะแปลง
* @param convClassName ประเภทที่จะแปลงเป็น
*/
private static void throwNoSupprt(Object object, String convClassName) {
String className = (object != null) ? object.getClass().getName()
: "โมฆะ";
ข้อความแสดงข้อผิดพลาด = "\nการแปลงประเภทสำหรับอ็อบเจ็กต์นี้ยังไม่ได้รับการสนับสนุน\n"“
+ ” [ วัตถุ ] = ” + วัตถุ + “,[ ประเภทวัตถุ ] = ” + ชื่อคลาส
+ “,[ convertClass ] = ” + convClassName + “”;
throw new UnsupportedOperationException(errorMess);
}
/**
* แปลงอักขระที่ตำแหน่ง [index] ในสตริง [str] ให้เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก
* <p>
* @param str สตริงที่จะถูกประเมิน
* @param index ระบุตำแหน่ง
* @param toCase แปลงเป็นตัวพิมพ์ใหญ่ ⇒ U | u แปลงเป็นตัวพิมพ์เล็ก ⇒ L | l
* @return สตริงที่แปลงแล้ว
*/
private static String convString(String str, int index, String toCase) {
if (str == null || str.trim().length() == 0) {
ส่งคืนค่าสตริง;
อื่น {
String temp = str.substring(index, index + 1);
ถ้า (toCase.equalsIgnoreCase(“u”)) {
temp = temp.toUpperCase();
อื่น {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = new StringBuffer(str);
tempBuffer.replace(index, index + 1, temp);
return tempBuffer.toString();
}
}
/**
* ฟังก์ชันนี้จะตรวจสอบว่า [value] เป็นค่าที่ถูกต้องหรือไม่
*
* @param value สตริงที่จะถูกประเมิน
* @return [true]: ถ้าไม่ใช่ค่าว่างและไม่ใช่ ""
*/
private static boolean isExist(String value) {
if (value != null && value.length() != 0) {
ส่งคืนค่าจริง;
}
ส่งคืนค่าเท็จ;
}
/**
* คลาส java.util.Date หรือคลาสย่อยในรูปแบบที่ระบุ
* แปลงเป็นสตริง
* @param date คลาส javautil.Date ที่ต้องการแปลง
* @param pattern ระบุรูปแบบ
* @ส่งคืนสตริงวันที่ที่จัดรูปแบบแล้ว
*/
private static String toStringDate(Date date, String pattern) {
SimpleDateFormat sdFormat = new SimpleDateFormat(pattern);
ส่งคืนค่า sdFormat.format(date);
}
private static java.sql.Date toSqlDate(String strDate) {
ปฏิทิน cal = toCalendar(strDate);
ส่งคืน toSqlDate(cal);
}
private static java.sql.Date toSqlDate(Calendar cal) {
long l = cal.getTime().getTime();
คืนค่า java.sql.Date ใหม่ (l);
}
/**
* แปลงค่าเวลาที่ยาวนานให้เป็นสตริงในรูปแบบที่กำหนด
* @param time ค่า long ที่แสดงเวลาปัจจุบันในหน่วยมิลลิวินาที
* @param pattern ระบุรูปแบบ
* @ส่งคืนสตริงวันที่ที่จัดรูปแบบแล้ว
*/
private static String toStringDate(long time, String pattern) {
ส่งคืนค่า toStringDate(new Date(time), pattern);
}
/**
* สตริง ⇒ java.sql.Date
*
* แปลงสตริงวันที่ต่อไปนี้เป็น java.sql.Date
* yyyy/MM/dd HH:mm:ss.SSS yyyy-MM-dd HH:mm:ss.SSS
*
* “20030407” “2003/04/07” “2003-04-07” “2003/04/07 15:20:16” “2003-04-07
* 15:20:16”
* @param strDate
* @กลับ
*/
private static Calendar toCalendar(String strDate) {
strDate = format(strDate);
Calendar cal = Calendar.getInstance();
int yyyy = Integer.parseInt(strDate.substring(0, 4));
int MM = Integer.parseInt(strDate.substring(5, 7));
int dd = Integer.parseInt(strDate.substring(8, 10));
int HH = cal.get(Calendar.HOUR_OF_DAY);
int mm = cal.get(Calendar.MINUTE);
int ss = cal.get(Calendar.SECOND);
int SSS = cal.get(Calendar.MILLISECOND);
แคลอรีเคลียร์();
cal.set(yyyy, MM – 1, dd);
int len = strDate.length();
สวิตช์ (ความยาว) {
กรณีที่ 10:
หยุดพัก;
กรณีที่ 16: // ปี/เดือน/วัน HH:มม.
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
หยุดพัก;
กรณีที่ 19: // yyyy/MM/dd HH:mm:ss
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
cal.set(Calendar.SECOND, ss);
หยุดพัก;
กรณีที่ 23: // yyyy/MM/dd HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
ss = Integer.parseInt(strDate.substring(17, 19));
SSS = Integer.parseInt(strDate.substring(20, 23));
cal.set(Calendar.HOUR_OF_DAY, HH);
cal.set(Calendar.MINUTE, mm);
cal.set(Calendar.SECOND, ss);
cal.set(Calendar.MILLISECOND, SSS);
หยุดพัก;
ค่าเริ่มต้น:
โยนข้อยกเว้น IllegalStateException ใหม่(
“"ไม่สามารถแปลงสตริงนี้เป็นสตริงวันที่ได้:"”
+ strDate);
}
คืนค่า cal;
}
/**
* ข้อมูลวันที่สามารถอยู่ในรูปแบบ "yyyy/MM/dd" หรือ "yyyy/MM/dd HH:mm:ss" ได้
* กำลังพยายามแปลงเป็นรูปแบบ
* ตัวอย่าง: 03/1/3 ⇒ 2003/01/03
* @param strDate
* @กลับ
*/
private static String format(String strDate) {
strDate = strDate.trim();
สตริง yyyy = null;
สตริง MM = null;
สตริง dd = null;
สตริง HH = null;
สตริง mm = null;
สตริง ss = null;
สตริง SSS = null;
// หากไม่มีเครื่องหมาย "-" หรือ "/"
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-“) == -1) {
if (strDate.length() == 8) {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
ส่งคืนค่า yyyy + “/” + MM + “/” + dd;
อื่น {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
mm = strDate.substring(12, 14);
ss = strDate.substring(15, 17);
ส่งคืนค่า yyyy + “/” + MM + “/” + dd + ” ” + HH + “:” + mm + “:”
+ ss;
}
}
StringTokenizer token = new StringTokenizer(strDate, “_/-:. “);
StringBuffer result = new StringBuffer();
for (int i = 0; token.hasMoreTokens(); i++) {
สตริง temp = token.nextToken();
สวิตช์ (i) {
กรณีที่ 0:// ปี ส่วน
yyyy = fillString(strDate, temp, “f”, “20”, 4);
ผลลัพธ์.เพิ่ม(yyyy);
หยุดพัก;
กรณีที่ 1:// เดือนส่วน
MM = fillString(strDate, temp, “f”, “0”, 2);
result.append("/" + MM);
หยุดพัก;
กรณีที่ 2:// ส่วนหนึ่งของวัน
dd = fillString(strDate, temp, “f”, “0”, 2);
result.append("/" + dd);
หยุดพัก;
กรณีที่ 3 ช่วงเวลา
HH = fillString(strDate, temp, “f”, “0”, 2);
ผลลัพธ์.เพิ่ม(" " + HH);
หยุดพัก;
กรณีที่ 4:// ส่วน
mm = fillString(strDate, temp, “f”, “0”, 2);
ผลลัพธ์.เพิ่ม (":" + มม.);
หยุดพัก;
กรณีที่ 5:// ส่วนที่เกี่ยวกับวินาที
ss = fillString(strDate, temp, “f”, “0”, 2);
result.append(":" + ss);
หยุดพัก;
กรณีที่ 6:// มิลลิวินาที ส่วน
SSS = fillString(strDate, temp, “b”, “0”, 3);
ผลลัพธ์.เพิ่ม("." + SSS);
หยุดพัก;
}
}
return result.toString();
}
private static String fillString(String strDate, String str,
ตำแหน่งสตริง, สตริง addStr, ความยาวจำนวนเต็ม) {
if (str.length() > len) {
String mes = strDate + "ไม่สามารถแปลงสตริงนี้เป็นสตริงวันที่ได้";
throw new IllegalStateException(mes);
}
ส่งคืนค่า fillString(str, position, addStr, len);
}
/**
* สตริงที่จะเพิ่มลงในสตริง [str] จะถูกกำหนดตำแหน่งที่ [position] แล้วจึงกำหนดความยาวที่ [len]
* เสียบจนสุด
* <p>
* ตัวอย่าง: String ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
*หมายเหตุ: ฟังก์ชัน fillString() จะแทรกสตริงจนกว่าจะถึงค่า len ในขณะที่ฟังก์ชัน addString() จะแทรกสตริงเท่ากับค่า len เท่านั้น
*
* @param str สตริงเป้าหมาย
* @param position แทรกก่อน ⇒ F/f แทรกหลัง ⇒ B/b
* @param addStr สตริงที่จะแทรก
* @param len จำนวนหลักที่จะบวก
* @return สตริงที่แปลงแล้ว หาก [str] เป็นค่าว่างหรือค่าตัวอักษรว่างเปล่า [addStr] จะถูกแปลงเป็น [len]
* ส่งคืนผลลัพธ์ของการแทรกจนกว่าจะตรงตามเงื่อนไข
*/
private static String fillString(String str, String position,
สตริง addStr, int len) {
StringBuffer tempBuffer = null;
ถ้า (!isExist(str)) {
tempBuffer = new StringBuffer();
for (int i = 0; i < len; i++) {
tempBuffer.append(addStr);
}
return tempBuffer.toString();
} else if (str.length() != len) {
tempBuffer = new StringBuffer(str);
while (len > tempBuffer.length()) {
ถ้า position.equalsIgnoreCase(“f”)) {
tempBuffer.insert(0, addStr);
อื่น {
tempBuffer.append(addStr);
}
}
return tempBuffer.toString();
}
ส่งคืนค่าสตริง;
}
}
