การสะท้อน Java เป็นเรื่องง่าย
ชวาของการสะท้อนขอแนะนำคลาสยูทิลิตี้ที่ช่วยให้คุณสามารถใช้ API ได้อย่างง่ายดาย
การสะท้อนคืออะไร?
API การสะท้อนฟัน,"java.lang.reflect” รวมอยู่ในแพ็คเกจ
นี่คือ API ที่ดึงข้อมูลเช่นฟิลด์และวิธีการจากคลาส Java
คลาสต่อไปนี้ส่วนใหญ่จะใช้
- java.lang.Class
- java.lang.reflect.Constructor
- java.lang.reflect.Method
- java.lang.reflect.Field
การสะท้อนเมื่อใช้ คุณสามารถสร้างคลาสหรือวิธีการเรียกโดยไม่ต้องเขียนโค้ดโดยตรง
คุณสามารถสร้างอินสแตนซ์คลาสจากสตริงหรือดำเนินการวิธีการได้
ด้วยการเขียนคำจำกัดความของชื่อคลาสและชื่อวิธีการในไฟล์ภายนอก เช่น XML คุณสามารถปรับใช้แอปพลิเคชันแบบไดนามิกให้เข้ากับการเปลี่ยนแปลงในสภาพแวดล้อมระหว่างรันไทม์ได้
นอกจากนี้ยังเป็น API ที่มีประสิทธิภาพมากสำหรับการสร้างแอปพลิเคชันที่มีความยืดหยุ่นสูง
วัตถุประสงค์ของการไตร่ตรอง
การสะท้อนมักไม่ค่อยถูกใช้โดยผู้ใช้โดยตรง
มีการใช้กันอย่างแพร่หลายในเว็บแอปพลิเคชัน เช่น Struts และเฟรมเวิร์ก เช่น การทำแผนที่ O/R
ตัวอย่างเช่น เมื่อตั้งค่าข้อมูลอินพุตหน้าจอเว็บเป็นคุณสมบัติ JavaBeans โดยอัตโนมัติ
ใช้เมื่อออก SQL ที่อัปเดตโดยอัตโนมัติตามคุณสมบัติ JavaBeans
นอกจากนี้ ฟังก์ชันต่างๆ เช่น การโหลดและการลงทะเบียนปลั๊กอินแบบไดนามิกที่ขยายฟังก์ชันการทำงานเมื่อแอปพลิเคชันเริ่มทำงานก็พร้อมใช้งานการสะท้อนสามารถทำได้ง่ายๆ โดยใช้ .
ดำเนินการตัวอย่าง
โปรดเรียกใช้ตัวอย่างและสัมผัสประสบการณ์การเขียนโปรแกรมที่เหมือนกรอบงาน
ที่นี่เราใช้คลาสต่อไปนี้การสะท้อนสาธิตการใช้งานยูทิลิตี้อย่างง่าย
Main.java...คลาสที่จะดำเนินการ
BeanUtil.java...คลาสยูทิลิตี้การสะท้อน
ฟรีซอฟท์.java...ใช้เป็นภาพสะท้อนในคลาสที่แสดงถึงซอฟต์แวร์เสรี
●เมื่อดำเนินการตามปกติ
FreeSoft freeSoft = FreeSoft ใหม่();
freeSoft.setName(“แชท&เมสเซนเจอร์ แชทและเมสเซนเจอร์!!”);
freeSoft.showName();
freeSoft.showPrice(0);
●เมื่อดำเนินการโดยใช้การสะท้อน
//สร้างอินสแตนซ์ของคลาส FreeSoft
วัตถุ invoidObject = BeanUtil.newInstance(“ฟรีซอฟท์”);
//ตั้งค่าในช่องชื่อ
BeanUtil.setProperty (เรียกใช้Object, "ชื่อ" , “แชท&เมสเซนเจอร์ แชทและเมสเซนเจอร์!!”);
// ดำเนินการเมธอด showName() ของ FreeSoft
BeanUtil.invive(เรียกใช้Object, “ชื่อรายการ”, โมฆะ);
// ดำเนินการวิธี showPrice() ของ FreeSoft
// หากเมธอดมีอาร์กิวเมนต์ จะต้องส่งผ่านเป็นอาร์เรย์ประเภทอ็อบเจ็กต์
BeanUtil.invive(เรียกใช้Object, “แสดงราคา”,วัตถุใหม่[]{จำนวนเต็มใหม่(0)});
●ผลการดำเนินการ
ผลลัพธ์การดำเนินการจะเหมือนกันไม่ว่าจะในกรณีปกติหรือเมื่อใช้การสะท้อนกลับ
ชื่อซอฟต์แวร์: Chat&Messenger Chat and Messenger! !
ราคา: 0 เยน
>>> เมื่อใช้การสะท้อน
ชื่อซอฟต์แวร์: Chat&Messenger Chat and Messenger! !
ราคา: 0 เยน
รายละเอียดวิธีการ BeanUtil
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(String className) ส่งข้อยกเว้น
- สร้างและส่งกลับอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส
– ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วน- ค่าส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(String className, Object[] argObj) ส่งข้อยกเว้น
- สร้างและส่งกลับอินสแตนซ์จากสตริง "className"
-
- พารามิเตอร์:
ชื่อคลาส
– ชื่อชั้นเรียนที่มีคุณสมบัติครบถ้วนหาเรื่องObj
– ข้อโต้แย้งของคอนสตรัคเตอร์- ค่าส่งคืน:
- อินสแตนซ์ใหม่ของชื่อคลาสแบบเต็ม
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(Class clazz) พ่น Exception
- สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
แคลซ
- ระดับ- ค่าส่งคืน:
- ตัวอย่างใหม่ของ clazz
- ข้อยกเว้น:
ข้อยกเว้น
ใหม่อินสแตนซ์
วัตถุคงที่สาธารณะ ใหม่อินสแตนซ์(Class clazz, Object[] argObj) ส่งข้อยกเว้น
- สร้างและส่งคืนอินสแตนซ์จากคลาส "clazz"
-
- พารามิเตอร์:
แคลซ
- ระดับหาเรื่องObj
– ข้อโต้แย้งของคอนสตรัคเตอร์- ค่าส่งคืน:
- ตัวอย่างใหม่ของ clazz
- ข้อยกเว้น:
ข้อยกเว้น
ตั้งค่าคุณสมบัติ
โมฆะคงที่สาธารณะ ตั้งค่าคุณสมบัติ(Object invoidObject, String fieldName, Object value) พ่นข้อยกเว้น
- เรียกเมธอด setter ของฟิลด์ "fieldName" ของอ็อบเจ็กต์ "invoidObject" และเก็บค่า "value"
หากไม่มีวิธี setter ค่าจะถูกตั้งค่าไปที่ฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อคุณสมบัติของวัตถุที่จะดำเนินการค่า
– ค่าที่จะกำหนด- ข้อยกเว้น:
ข้อยกเว้น
– มีข้อยกเว้นต่อไปนี้เกิดขึ้นการร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้ไม่มีSuchMethodException
– หากไม่พบวิธีการตามชื่อที่ระบุ
รับคุณสมบัติ
วัตถุคงที่สาธารณะ รับคุณสมบัติ(Object invoidObject, String fieldName) ส่งข้อยกเว้น
- เรียกเมธอด getter ของฟิลด์ fieldName ของอ็อบเจ็กต์ invoidObject เพื่อรับค่า
หากไม่มีเมธอด getter ค่าจะถูกดึงมาจากฟิลด์โดยตรง อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ -
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ- ค่าส่งคืน:
- ค่าส่งคืนวิธี Getter
- ข้อยกเว้น:
ข้อยกเว้น
– มีข้อยกเว้นต่อไปนี้เกิดขึ้นการร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้NoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
วิงวอน
วัตถุคงที่สาธารณะ วิงวอน(Object invoidObject, String callMethod, Object[] argObjects) พ่น InvocationTargetException, IllegalAccessException, NoSuchMethodException
- ดำเนินการเมธอด "callMethod" ของอ็อบเจ็กต์ "invoidObject"
หากมีค่าตอบแทนก็สามารถรับเป็นวัตถุได้ -
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการวิธีการโทร
– ชื่อวิธีดำเนินการargObjects
– หากมีข้อโต้แย้ง ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีข้อโต้แย้งให้ส่งค่าว่าง- ค่าส่งคืน:
- ส่งคืนค่าของการดำเนินการ "callMethod"
- ข้อยกเว้น:
การร้องขอ TargetException
– หากวิธีการพื้นฐานส่งข้อยกเว้นข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– วัตถุเมธอดนี้คือ Java
เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้ไม่มีSuchMethodException
– หากไม่พบวิธีการตามชื่อที่ระบุ
ค้นหาวิธีการ
วิธีสาธารณะแบบคงที่ ค้นหาวิธีการ(Object invoidObject, String callMethod, Object[] argObjects) พ่น NoSuchMethodException
- ค้นหาวิธีการ 'callMethod' ของวัตถุ 'involveObject'
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการวิธีการโทร
– ชื่อวิธีการของวัตถุที่จะดำเนินการargObjects
– หากมีข้อโต้แย้ง ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์ หากไม่มีข้อโต้แย้งให้ส่งค่าว่าง- ค่าส่งคืน:
- วัตถุวิธีการที่ตรงกับเงื่อนไขอาร์กิวเมนต์ที่ระบุ
- ข้อยกเว้น:
ไม่มีSuchMethodException
– หากไม่พบวิธีการจับคู่หรือหากชื่อเป็น “” หรือ “”
setField
โมฆะคงที่สาธารณะ setField(Object invoidObject, String fieldName, Object value) พ่น IllegalAccessException, NoSuchFieldException
- เก็บค่า "value" ไว้ในชื่อฟิลด์ "fieldName" ของออบเจ็กต์ที่จะดำเนินการ "invoidObject"
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อฟิลด์ของวัตถุที่จะดำเนินการค่า
– ค่าที่จะกำหนด- ข้อยกเว้น:
ข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– ฟิลด์ที่ใช้วัตถุที่ระบุ (หรือคลาสย่อยหรือตัวดำเนินการ)
ไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซที่ประกาศ หรือหากการแปลงที่คลายไฟล์ล้มเหลวNoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
getField
วัตถุคงที่สาธารณะ getField(Object invoidObject, String fieldName) พ่น IllegalAccessException, NoSuchFieldException
- รับค่าของชื่อฟิลด์ "fieldName" ของออบเจ็กต์ที่จะดำเนินการ "invoidObject"
-
- พารามิเตอร์:
เรียกใช้Object
– วัตถุที่จะดำเนินการชื่อฟิลด์
– ชื่อฟิลด์ของวัตถุที่จะดำเนินการ- ค่าส่งคืน:
- ส่งกลับค่า
- ข้อยกเว้น:
ข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย
– ฟิลด์ที่ใช้วัตถุที่ระบุ (หรือคลาสย่อยหรือตัวดำเนินการ)
ไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซที่ประกาศ หรือหากการแปลงที่คลายไฟล์ล้มเหลวNoSuchFieldException
– หากไม่พบช่องที่มีชื่อที่ระบุ
มีฟิลด์
บูลีนคงที่สาธารณะ มีฟิลด์(วัตถุวัตถุ ชื่อฟิลด์สตริง) ส่งข้อยกเว้น
- ตรวจสอบว่าวัตถุ 'วัตถุ' ประกาศชื่อฟิลด์ 'fieldName'
-
- พารามิเตอร์:
วัตถุ
– วัตถุที่จะตรวจสอบชื่อฟิลด์
– ชื่อฟิลด์ที่จะตรวจสอบ- ค่าส่งคืน:
- จริงถ้าประกาศ
- ข้อยกเว้น:
ข้อยกเว้น
รับ AllFields
java.util.TreeSet สาธารณะแบบคงที่ รับ AllFields(วัตถุวัตถุ) ส่งข้อยกเว้น
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
- ข้อยกเว้น:
ข้อยกเว้น
getShortClassName
สตริงคงที่สาธารณะ getShortClassName(วัตถุวัตถุ)
- รับชื่อคลาสที่ไม่ผ่านการรับรองจากอ็อบเจ็กต์
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
getShortClassName
สตริงคงที่สาธารณะ getShortClassName(ชื่อคลาสสตริง)
- รับชื่อคลาสจากชื่อแบบเต็ม
-
- พารามิเตอร์:
ชื่อคลาส
–- ค่าส่งคืน:
getFieldName
สตริงคงที่สาธารณะ getFieldName(ชื่อวิธีสตริง)
- เปลี่ยนชื่อฟิลด์จากชื่อวิธีการ ต้องเป็นไปตามแบบแผน JavaBeans
-
- พารามิเตอร์:
ชื่อวิธีการ
–- ค่าส่งคืน:
คือClassExist
บูลีนคงที่สาธารณะ คือClassExist(ชื่อคลาสสตริง)
- ตรวจสอบว่าชื่อแบบเต็ม "className" เป็นชื่อคลาสที่มีอยู่
-
- พารามิเตอร์:
ชื่อคลาส
–- ค่าส่งคืน:
getPropertyDescriptors
PropertyDescriptor คงที่สาธารณะ[] getPropertyDescriptors(วัตถุวัตถุ) พ่น IntrospectionException
- ส่งกลับ PropertyDescriptor ที่เก็บข้อมูลวัตถุสำหรับ "วัตถุ"
-
- พารามิเตอร์:
วัตถุ
–- ค่าส่งคืน:
- ข้อยกเว้น:
java.beans.IntrospectionException
ซอร์สโค้ด BeanUtil
/**
* คลาสยูทิลิตี้ที่ช่วยให้คุณสามารถใช้ Reflection API ของ Java ได้อย่างง่ายดาย
*/
BeanUtil คลาสสาธารณะ {
/** */
สตริงสุดท้ายคงที่ส่วนตัว GET = “GET”;
/** */
ส่วนตัวคงที่สุดท้าย String SET = “SET”;
// ———————————————————- 『อินสแตนซ์ใหม่』
/**
* สร้างและส่งคืนอินสแตนซ์จากสตริง "className"
* @param className ชื่อคลาสที่มีคุณสมบัติครบถ้วน
* @return อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
* @พ่นข้อยกเว้น
*/
วัตถุคงที่สาธารณะ newInstance (String className) พ่นข้อยกเว้น {
พยายาม {
กลับ Class.forName(className).newInstance();
} จับ (NoClassDefFoundError จ) {
System.err.println(“NoClassDefFoundError : ” + ชื่อคลาส);
โยนอี;
}
}
/**
* สร้างและส่งคืนอินสแตนซ์จากสตริง "className"
* @param className ชื่อคลาสที่มีคุณสมบัติครบถ้วน
* อาร์กิวเมนต์ตัวสร้าง @param argObj
* @return อินสแตนซ์ใหม่ของชื่อคลาสที่มีคุณสมบัติครบถ้วน
* @พ่นข้อยกเว้น
*/
วัตถุคงที่สาธารณะ newInstance (String className, Object [] argObj)
พ่นข้อยกเว้น {
คลาส[] argClass = คลาสใหม่[argObj.length];
สำหรับ (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
ตัวสร้าง c = Class.forName(className).getConstructor(argClass);
กลับ c.newInstance (argObj);
}
/**
* สร้างและส่งคืนอินสแตนซ์จากคลาส 'clazz'
* @param clazz คลาส
* @return ตัวอย่างใหม่ของ clazz
* @พ่นข้อยกเว้น
*/
วัตถุคงที่สาธารณะ newInstance (Class clazz) พ่นข้อยกเว้น {
กลับ clazz.newInstance();
}
/**
* สร้างและส่งคืนอินสแตนซ์จากคลาส 'clazz'
* @param clazz คลาส
* อาร์กิวเมนต์ตัวสร้าง @param argObj
* @return ตัวอย่างใหม่ของ clazz
* @พ่นข้อยกเว้น
*/
วัตถุคงที่สาธารณะ newInstance (Class clazz, Object [] argObj)
พ่นข้อยกเว้น {
คลาส[] argClass = คลาสใหม่[argObj.length];
สำหรับ (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
ตัวสร้าง c = clazz.getConstructor (argClass);
กลับ c.newInstance (argObj);
}
// ---------------------"วิธี"
/**
* วิธีการ Setter ของฟิลด์ "fieldName" ของวัตถุ "involveObject"
* โทรเก็บมูลค่า 'มูลค่า'
* <br>
* หากไม่มีวิธี setter ให้ตั้งค่าไปที่ฟิลด์โดยตรง
* อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ
* ค่า @param ค่าที่จะตั้งค่า
* @throws ข้อยกเว้น มีข้อยกเว้นต่อไปนี้เกิดขึ้น
* @throws InvocationTargetException หากวิธีการพื้นฐานส่งข้อยกเว้น
* @throws IllegalAccessException หากวัตถุ Method นี้เป็น Java
* เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้
* @throws NoSuchMethodException หากไม่พบวิธีการที่มีชื่อที่ระบุ
*/
setProperty โมฆะคงที่สาธารณะ (วัตถุเรียกใช้Object, ชื่อฟิลด์สตริง,
ค่าวัตถุ) ส่งข้อยกเว้น {
พยายาม {
วิธีการ วิธีการ = searchMethod (invoidObject, fieldName, SET);
คลาส[] paramClasses = method.getParameterTypes();
วัตถุ [] valueArray = null;
ถ้า (paramClasses[0].isInstance(ค่า)) {
//อย่าแปลงถ้าวัตถุที่จะตั้งค่าเป็นคลาสย่อยของคลาสอาร์กิวเมนต์
valueArray = วัตถุใหม่ [] { ค่า };
} อื่น {
valueArray = วัตถุใหม่ [] { convObject (ค่า, paramClasses [0]
.getName()) };
}
method.inurge(involvedObject, valueArray);
} จับ (NoSuchMethodException จ) {
พยายาม {
// หากไม่มีเมธอด setter ให้ตั้งค่าไปที่ฟิลด์โดยตรง
setField(invoidObject, fieldName, ค่า);
} จับ (NoSuchFieldException fe) {
สตริง errorMes = “\nClass” + getShortClassName(involveObject)
+ “เป็น” + “สำหรับฟิลด์ “” + ชื่อฟิลด์ + “”\n”
+ “ไม่มีวิธีการตั้งค่าที่เข้าถึงได้ และ”
+ “ฟิลด์ “” + ชื่อฟิลด์
+ “” ไม่เป็นสาธารณะเช่นกัน ” + “”;
โยน IllegalAccessException ใหม่ (errorMes);
}
}
}
/**
* วิธีการ Getter ของฟิลด์ fieldName ของวัตถุ invoidObject
* รับค่าโทร <br>
* หากไม่มีเมธอด getter ค่าจะได้รับจากฟิลด์โดยตรง
* อย่างไรก็ตาม ในกรณีนี้ ตัวแก้ไขการเข้าถึงของคุณสมบัติเป้าหมายจะต้องเป็นแบบสาธารณะ
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อคุณสมบัติของวัตถุที่จะดำเนินการ
* @return ค่าส่งคืนของเมธอด getter
* @throws ข้อยกเว้น มีข้อยกเว้นต่อไปนี้เกิดขึ้น
* @throws InvocationTargetException หากวิธีการพื้นฐานส่งข้อยกเว้น
* @throws IllegalAccessException หากวัตถุ Method นี้เป็น Java
* เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
วัตถุคงที่สาธารณะ getProperty (วัตถุเรียกใช้Object, ชื่อฟิลด์สตริง)
พ่นข้อยกเว้น {
พยายาม {
วิธีการ วิธีการ = searchMethod (เรียกใช้Object, fieldName, GET);
กลับ method.inurge(involvedObject, null);
} จับ (NoSuchMethodException จ) {
ส่งคืน getField (เรียกใช้Object, fieldName);
}
}
/**
* ดำเนินการวิธีการ "callMethod" ของวัตถุ "invoidObject"
* หากมีการคืนค่าสามารถรับเป็นประเภท Object ได้
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* ชื่อเมธอด @param callMethod ที่จะดำเนินการ
* @param argObjects หากมีอาร์กิวเมนต์ ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์
* ผ่าน null หากไม่มีข้อโต้แย้ง
* @return ส่งคืนค่าของการดำเนินการ "callMethod"
* @throws InvocationTargetException หากวิธีการพื้นฐานส่งข้อยกเว้น
* @throws IllegalAccessException หากวัตถุ Method นี้เป็น Java
* เมื่อมีการใช้การควบคุมการเข้าถึงภาษาและไม่สามารถเข้าถึงวิธีการพื้นฐานได้
* @throws NoSuchMethodException หากไม่พบวิธีการที่มีชื่อที่ระบุ
*/
การเรียกใช้วัตถุคงที่สาธารณะ (Object invoidObject, String callMethod,
Object[] argObjects) พ่น InvocationTargetException
IllegalAccessException, NoSuchMethodException {
วิธีการ วิธีการ = findMethod (invoidObject, callMethod, argObjects);
วิธีการส่งคืน. เรียกใช้ (invivoObject, argObjects);
}
/**
* ค้นหาวิธีการ 'callMethod' ของวัตถุ 'involveObject'
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* ชื่อเมธอด @param callMethod ของอ็อบเจ็กต์ที่จะดำเนินการ
* @param argObjects หากมีอาร์กิวเมนต์ ให้ส่งผ่านเป็นอาร์เรย์ของอ็อบเจ็กต์
* ผ่าน null หากไม่มีข้อโต้แย้ง
* วัตถุวิธีการ @return ที่ตรงกับเงื่อนไขอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchMethodException หากไม่พบวิธีการที่ตรงกัน
* หรือถ้าชื่อคือ “ " หรือ " "ในกรณีของ
*/
วิธีการคงที่สาธารณะ findMethod (Object เรียกใช้Object, CallMethod สตริง,
วัตถุ [] argObjects) พ่น NoSuchMethodException {
คลาส [] paramClasses = null;
วิธีการ [] วิธีการ = involveObject.getClass().getMethods();
ด้านบน: สำหรับ (int i = 0; i < method.length; i++) {
ถ้า (วิธีการ [i] .getName (). เท่ากับ (callMethod)) {
ถ้า (argObjects == null
&& วิธีการ [i].getParameterTypes().length == 0) {
วิธีการส่งคืน [i];
}
ถ้า (argObjects == null) {
ดำเนินการต่อ;
}
paramClasses = วิธีการ [i] .getParameterTypes ();
ถ้า (paramClasses.length == argObjects.length) {
// ตรวจสอบประเภทรายการพารามิเตอร์และประเภทอาร์กิวเมนต์ทั้งหมด
สำหรับ (int j = 0; j < paramClasses.length; j ++) {
คลาส paramClass = paramClasses[j];
วัตถุ argObj = argObjects[j];
// ถ้าประเภทอาร์กิวเมนต์เป็นแบบดั้งเดิม วัตถุอาร์กิวเมนต์
// ไม่เป็นโมฆะและเป็นค่าดั้งเดิม
//ถ้าเป็นคลาสย่อยของ Number ก็ไม่เป็นไร
ถ้า (argObj == null) {
ดำเนินการต่อ;
}
ถ้า (paramClass.isPrimitive()
&& (อินสแตนซ์ argObj ของหมายเลข || argObj
.getClass().isPrimitive())) {
ดำเนินการต่อ;
}
ถ้า (!paramClass.isInstance(argObj)) {
// ดำเนินการตามวิธีถัดไปเมื่อประเภทเข้ากันไม่ได้กับการแปลงโดยนัย
ดำเนินการต่อด้านบน;
}
}
วิธีการส่งคืน [i];
}
}
}
String paramLength = (paramClasses != null) ? Integer
.toString(paramClasses.length) : “”;
สตริง errorMes = getShortClassName(invoidObject) + “method”
+ callMethod + “ไม่มี” + "[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
โยน NoSuchMethodException ใหม่ (errorMes);
}
// ----------------------"สนาม"
/**
* ค่าสำหรับชื่อฟิลด์ "fieldName" ของวัตถุ "involvedObject" ที่จะดำเนินการ
* เก็บ "คุณค่า"
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อฟิลด์ของวัตถุที่จะดำเนินการ
* ค่า @param ค่าที่จะตั้งค่า
* @throws IllegalAccessException หากวัตถุที่ระบุเป็น
* ฟิลด์ (หรือคลาสย่อยหรือตัวดำเนินการ)
* หากไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซ ให้ประกาศ
* หรือหากการแปลงการแกะไฟล์ล้มเหลว
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
โมฆะคงที่สาธารณะ setField (วัตถุเรียกใช้Object, สตริงชื่อฟิลด์,
ค่าวัตถุ) พ่น IllegalAccessException, NoSuchFieldException {
ฟิลด์ฟิลด์ = searchField (เรียกใช้Object, fieldName);
สตริง className = field.getType().getName();
วัตถุ convObj = null;
ถ้า (field.getType().isInstance(ค่า)) {
ConvObj = ค่า;
} อื่น {
ConvObj = ConvObject (ค่า, ชื่อคลาส);
}
field.set(involvedObject, convObj);
}
/**
* ตั้งค่าของชื่อฟิลด์ "fieldName" ของวัตถุการดำเนินการ "invoidObject" เป็น
* รับ.
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อฟิลด์ของวัตถุที่จะดำเนินการ
* @return ค่าส่งคืน
* @throws IllegalAccessException หากวัตถุที่ระบุเป็น
* ฟิลด์ (หรือคลาสย่อยหรือตัวดำเนินการ)
* หากไม่ใช่อินสแตนซ์ของคลาสหรืออินเทอร์เฟซ ให้ประกาศ
* หรือหากการแปลงการแกะไฟล์ล้มเหลว
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
วัตถุคงที่สาธารณะ getField (วัตถุเรียกใช้Object, ชื่อฟิลด์สตริง)
พ่น IllegalAccessException, NoSuchFieldException {
ฟิลด์ฟิลด์ = searchField (เรียกใช้Object, fieldName);
กลับ field.get (เรียกใช้Object);
}
/**
* ตรวจสอบว่าวัตถุ "วัตถุ" ประกาศชื่อฟิลด์ "fieldName"
* ยืนยัน.
* @param object วัตถุที่จะตรวจสอบ
* @param fieldName ชื่อฟิลด์ที่จะตรวจสอบ
* @return true หากประกาศ
* @พ่นข้อยกเว้น
*/
hasField บูลีนคงที่สาธารณะ (วัตถุวัตถุ, ชื่อฟิลด์สตริง)
พ่นข้อยกเว้น {
PropertyDescriptor [] อุปกรณ์ประกอบฉาก = getPropertyDescriptors (วัตถุ);
สำหรับ (int i = 0; i < อุปกรณ์ประกอบฉาก.ความยาว; i++) {
สตริง _fieldName = อุปกรณ์ประกอบฉาก[i].getName();
ถ้า (fieldName.equals(_fieldName)) {
กลับเป็นจริง;
}
}
กลับเท็จ;
}
/**
*
* วัตถุ @param
* @กลับ
* @พ่นข้อยกเว้น
*/
TreeSet getAllFields แบบคงที่สาธารณะ (วัตถุวัตถุ) พ่นข้อยกเว้น {
TreeSet fieldSet = TreeSet ใหม่ ();
// รับชื่อคุณสมบัติจากวิธี
PropertyDescriptor [] อุปกรณ์ประกอบฉาก = getPropertyDescriptors (วัตถุ);
สำหรับ (int i = 0; i < อุปกรณ์ประกอบฉาก.ความยาว; i++) {
สตริง fieldName = อุปกรณ์ประกอบฉาก [i] .getName ();
fieldSet.add(ชื่อฟิลด์);
}
// รับชื่อคุณสมบัติจากฟิลด์
ฟิลด์ [] = object.getClass().getFields();
สำหรับ (int i = 0; i <fields.length; i++) {
สตริง fieldName = ฟิลด์ [i] .getName ();
ถ้า (!fieldSet.contains(ชื่อฟิลด์)) {
fieldSet.add(ชื่อฟิลด์);
}
}
กลับสนามชุด;
}
/**
*
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อฟิลด์ของวัตถุที่จะดำเนินการ
* @return วัตถุที่ยื่นซึ่งตรงกับเงื่อนไขอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchFieldException หากไม่พบฟิลด์ที่มีชื่อที่ระบุ
*/
searchField ฟิลด์คงที่ส่วนตัว (วัตถุเรียกใช้Object, ชื่อฟิลด์สตริง)
พ่น NoSuchFieldException {
พยายาม {
ส่งคืน invoidObject.getClass().getField(fieldName);
} จับ (NoSuchFieldException จ) {
// ขอบเขตนี้ได้มาจากชื่อคอลัมน์ของตาราง
fieldName = checkFieldName(ชื่อฟิลด์);
ฟิลด์ [] = invoidObject.getClass().getFields();
สำหรับ (int i = 0; i <fields.length; i++) {
ถ้า (ฟิลด์ [i] .getName (). เท่ากับ IgnoreCase (ชื่อฟิลด์)) {
ส่งคืนฟิลด์ [i];
}
}
โยน NoSuchFieldException ใหม่ (fieldName);
}
}
// ----------------------" คนอื่น "
/**
* รับชื่อคลาสที่ไม่ผ่านการรับรองจากวัตถุ
* วัตถุ @param
* @กลับ
*/
สตริงสาธารณะ getShortClassName (วัตถุวัตถุ) {
ถ้า (วัตถุ == null) {
ส่งคืน "โมฆะ";
}
ชื่อสตริง = object.getClass().getName();
กลับ getShortClassName (ชื่อ);
}
/**
* รับชื่อคลาสจากชื่อที่มีคุณสมบัติครบถ้วน
* @param className
* @กลับ
*/
สาธารณะสตริง getShortClassName (ClassName สตริง) {
ดัชนี int = className.lastIndexOf(“.”);
กลับ className.substring (ดัชนี + 1);
}
/**
* เปลี่ยนชื่อฟิลด์จากชื่อวิธีการ สอดคล้องกับข้อตกลง JavaBeans
* มันจำเป็น.
* @param methodName
* @กลับ
*/
สาธารณะสตริง getFieldName (วิธีการสตริง) {
สตริงชื่อฟิลด์ = null;
ถ้า (methodName.startsWith ("เป็น")) {
fieldName = methodName.substring(2);
} อื่น {
fieldName = methodName.substring(3);
}
fieldName = convString(ชื่อฟิลด์, 0, “L”);
ส่งคืนชื่อฟิลด์;
}
/**
* ตรวจสอบว่าชื่อแบบเต็ม "className" เป็นชื่อคลาสที่มีอยู่
* @param className
* @กลับ
*/
สาธารณะ isClassExist บูลีนคงที่ (ชื่อคลาสสตริง) {
พยายาม {
Class.forName(ชื่อคลาส);
กลับเป็นจริง;
} จับ (ข้อยกเว้นจ) {
กลับเท็จ;
}
}
แผนที่คงที่สุดท้ายส่วนตัว beanInfoCache = ใหม่ HashMap ();
/**
* ส่งกลับ PropertyDescriptor ที่เก็บข้อมูลวัตถุสำหรับ "วัตถุ"
* วัตถุ @param
* @กลับ
* @ พ่น IntrospectionException
*/
PropertyDescriptor คงที่สาธารณะ [] getPropertyDescriptors (วัตถุวัตถุ)
พ่น IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
ถ้า (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
กลับ beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ——————————————— “วิธีส่วนตัวด้านล่าง”
// ————————————————————————–
/**
* ค้นหาวิธีการเข้าถึงสำหรับอาร์กิวเมนต์ fieldName ตาม PropertyDescriptor
* @param เรียกใช้วัตถุวัตถุที่จะดำเนินการ
* @param fieldName ชื่อฟิลด์
* @param ประเภทวิธี Getter ⇒ วิธี GET Getter ⇒ SET
* วัตถุวิธีการ @return ที่ตรงกับเงื่อนไขอาร์กิวเมนต์ที่ระบุ
* @throws NoSuchMethodException หากไม่พบวิธีการที่ตรงกัน
* หรือถ้าชื่อคือ “ " หรือ " ”
* ในกรณีของ
* @ พ่น IntrospectionException
*/
วิธีการค้นหาแบบคงที่ส่วนตัว (วัตถุเรียกใช้Object, ชื่อฟิลด์สตริง,
ประเภทสตริง) พ่น NoSuchMethodException, IntrospectionException {
วิธีการ วิธีการ = null;
fieldName = checkFieldName(ชื่อฟิลด์);
PropertyDescriptor [] อุปกรณ์ประกอบฉาก = getPropertyDescriptors (เรียกใช้Object);
สำหรับ (int i = 0; i < อุปกรณ์ประกอบฉาก.ความยาว; i++) {
ชื่อสตริง = อุปกรณ์ประกอบฉาก [i] .getName ();
ถ้า (!name.equalsIgnoreCase(ชื่อฟิลด์)) {
ดำเนินการต่อ;
}
ถ้า (type.equals(GET)) {
วิธีการ = อุปกรณ์ประกอบฉาก [i] .getReadMethod ();
} อื่น {
วิธีการ = อุปกรณ์ประกอบฉาก [i] .getWriteMethod ();
}
ถ้า (วิธี == null) {
ดำเนินการต่อ;
}
วิธีการคืน;
}
// หากไม่มีวิธีการนี้
โยน NoSuchMethodException ใหม่ (“คลาสไม่มีวิธีการ”
+ “(ไม่คำนึงถึงขนาดตัวพิมพ์): ” + type.toLowerCase()
+ convString(ชื่อฟิลด์, 0, “U”) + “()”);
}
/**
* ตรวจสอบว่าอาร์กิวเมนต์ fieldName เป็นชื่อคอลัมน์หรือไม่ หากเป็นชื่อคอลัมน์
* แปลงกลับ
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ ที่อยู่อีเมล = mailAddress
* @param fieldName ชื่อฟิลด์หรือชื่อคอลัมน์
* ชื่อช่อง @return
*/
checkFieldName สตริงคงที่ส่วนตัว (ชื่อฟิลด์สตริง) {
ดัชนี int = fieldName.indexOf(“_”);
ในขณะที่ (จริง) {
ถ้า (ดัชนี == -1) {
ส่งคืนชื่อฟิลด์;
}
StringBuffer convcloumn = StringBuffer ใหม่ (ชื่อฟิลด์);
convcloumn.deleteCharAt (ดัชนี);
fieldName = convcloumn.toString();
ดัชนี = fieldName.indexOf(“_”);
}
}
/**
* แปลงวัตถุที่จะแปลง วัตถุ เป็นประเภทของ convClassName
*
* วัตถุ @param วัตถุที่จะแปลง
* สตริงคลาส @param convClassName ประเภทที่จะแปลง
* @return วัตถุที่แปลงแล้ว
*/
convObject วัตถุคงที่ส่วนตัว (วัตถุวัตถุ, ConvClassName สตริง) {
ถ้า (วัตถุ == null) {
// การส่งคืนค่าว่างเมื่อแปลงเป็นประเภทดั้งเดิมจะส่งผลให้เกิดข้อผิดพลาด
// ทำให้เป็น wrapper สำหรับ 0
ถ้า (convClassName.equals (“int”)) {
ส่งคืนจำนวนเต็มใหม่ (0);
} อื่น ๆ ถ้า (convClassName.equals (“ยาว”)) {
กลับใหม่ยาว (0);
} อื่น {
กลับเป็นโมฆะ;
}
}
ถ้า (object.getClass().getName().equals(convClassName)) {
คืนวัตถุ;
}
// —————————————- 『วัตถุอินสแตนซ์ของสตริง』
ถ้า (อินสแตนซ์ของวัตถุของสตริง) {
ถ้า (convClassName.equals (“java.lang.String”)) {
คืนวัตถุ;
} อื่นถ้า (convClassName.equals(“java.lang.Long”)
|| convClassName.equals("ยาว")) {
สตริง str = วัตถุ (สตริง);
ถ้า (มีอยู่ (str)) {
// มันจะแย่ถ้าคุณไม่แปลงเป็น BigDecimal สักครั้ง
// 1000.00000
BigDecimal ใหญ่ = ใหม่ BigDecimal(str);
กลับใหม่ยาว(big.longValue());
} อื่น {
// ถ้า str เป็นเชลล์ลิเทอรัล ให้ตั้งค่าเริ่มต้นเป็น "0"
กลับใหม่ยาว (0);
}
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Date”)) {
กลับไปที่วัตถุ SqlDate ((สตริง));
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Timestamp”)) {
วันที่ date = toSqlDate ((สตริง) วัตถุ);
ส่งคืนการประทับเวลาใหม่ (date.getTime());
} อื่นถ้า (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals("int")) {
// ถ้า str เป็นเชลล์ลิเทอรัล ให้ตั้งค่าเริ่มต้นเป็น "0"
สตริง str = วัตถุ (สตริง);
ถ้า (มีอยู่ (str)) {
BigDecimal ใหญ่ = ใหม่ BigDecimal(str);
คืนจำนวนเต็มใหม่ (big.intValue ());
} อื่น {
ส่งคืนจำนวนเต็มใหม่ (0);
}
} อื่น ๆ ถ้า (convClassName.equals (“บูลีน”)) {
กลับ Boolean.valueOf(object.toString());
} อื่นถ้า (convClassName.equals(“java.math.BigDecimal”)) {
สตริง temp = ((สตริง) object).trim();
// ถ้า temp.length() == 0 สามารถตั้งค่าเป็น null แทนที่จะเป็น 0 ได้อย่างปลอดภัย
ถ้า (temp.length() == 0) {
กลับเป็นโมฆะ;
} อื่น {
กลับ BigDecimal ใหม่ (ชั่วคราว);
}
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// ———————————“ อินสแตนซ์ของวัตถุ java.sql.Date”
อื่นถ้า (อินสแตนซ์ของวัตถุของ java.sql.Date) {
ถ้า (convClassName.equals (“java.lang.String”)) {
กลับไปที่StringDate((java.sql.Date) object, “yyyy/MM/dd”);
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Date”)) {
คืนวัตถุ;
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Timestamp”)) {
ส่งคืน Timestamp ใหม่ (((วันที่) object).getTime());
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// ————————————- 『วัตถุอินสแตนซ์ของการประทับเวลา』
อื่นถ้า (อินสแตนซ์ของวัตถุของการประทับเวลา) {
เวลานาน = ((ประทับเวลา) วัตถุ).getTime();
ถ้า (convClassName.equals (“java.lang.String”)) {
กลับไปที่StringDate(เวลา “yyyy/MM/dd HH:mm:ss”);
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Date”)) {
ส่งคืน java.sql.Date ใหม่ (เวลา);
} อื่น ๆ ถ้า (convClassName.equals (“java.sql.Timestamp”)) {
คืนวัตถุ;
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// —————————————- 『ตัวอย่างวัตถุของจำนวนเต็ม』
อื่นถ้า (อินสแตนซ์ของวัตถุของจำนวนเต็ม) {
ถ้า (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
คืนวัตถุ;
} อื่นถ้า (convClassName.equals("java.lang.String")) {
กลับ object.toString();
} อื่นถ้า (convClassName.equals(“java.lang.Long”)
|| convClassName.equals("ยาว")) {
กลับใหม่ยาว (((วัตถุจำนวนเต็ม)).longValue());
} อื่นถ้า (convClassName.equals(“java.math.BigDecimal”)) {
กลับ BigDecimal ใหม่ (((Integer) object).intValue());
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// —————————————— 『ตัวอย่างวัตถุของ Long』
อื่นถ้า (อินสแตนซ์ของวัตถุแบบยาว) {
ถ้า (convClassName.equals("java.lang.Long")
|| convClassName.equals("ยาว")) {
คืนวัตถุ;
} อื่นถ้า (convClassName.equals("java.lang.String")) {
กลับ object.toString();
} อื่นถ้า (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals("int")) {
ส่งคืน Integer ใหม่ (((Long) object).intValue());
} อื่นถ้า (convClassName.equals(“java.math.BigDecimal”)) {
กลับ BigDecimal ใหม่ (((Long) object).longValue());
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// —————————————- 『วัตถุอินสแตนซ์ของ Double』
อื่นถ้า (อินสแตนซ์ของวัตถุของ Double) {
ถ้า (convClassName.equals (“java.lang.String”)) {
// หมายเลขคอลัมน์ (8,0)
// windows oracle > BigDecimal
// UNIX oracle > สองเท่า
BigDecimal ใหญ่ = ใหม่ BigDecimal(((Double) object).doubleValue());
ขนาด int = big.scale();
ถ้า (มาตราส่วน == 0) {
กลับ big.toString();
} อื่น {
// ไม่รองรับหากจำเป็นต้องปัดเศษ
ThrowNoSupprt(วัตถุ, ConvClassName);
}
}
ถ้า (convClassName.equals("java.lang.Integer")
|| convClassName.equals("int")) {
ส่งคืน Integer ใหม่ (((Double) object).intValue());
} อื่นถ้า (convClassName.equals(“java.lang.Long”)
|| convClassName.equals("ยาว")) {
กลับใหม่ยาว(((วัตถุคู่)).longValue());
} อื่นถ้า (convClassName.equals(“java.math.BigDecimal”)) {
กลับ BigDecimal ใหม่ (((Double) object).doubleValue());
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// ————————————“ อินสแตนซ์วัตถุของ BigDecimal ”
อื่นถ้า (อินสแตนซ์วัตถุของ BigDecimal) {
ถ้า (convClassName.equals (“java.lang.String”)) {
กลับ object.toString();
} อื่นถ้า (convClassName.equals(“java.lang.Long”)
|| convClassName.equals("ยาว")) {
กลับใหม่ยาว(((BigDecimal) object).longValue());
} อื่นถ้า (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals("int")) {
ส่งคืน Integer ใหม่ (((BigDecimal) object).intValue());
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// —————————————- 『อินสแตนซ์ของวัตถุของไบต์[]』
อื่นถ้า (อินสแตนซ์ของวัตถุของไบต์ []) {
ถ้า (convClassName.equals (“java.sql.Blob”)) {
คืนวัตถุ;
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// ————————————————“ วัตถุเป็นบูลีน”
อื่นถ้า (อินสแตนซ์ของวัตถุของบูลีน) {
ถ้า (convClassName.equals (“บูลีน”)) {
คืนวัตถุ;
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
// ———————————————-『วัตถุเป็นบูลีน[]』
อื่นถ้า (อินสแตนซ์ของวัตถุของบูลีน []) {
ถ้า (convClassName.equals (“java.lang.String”)) {
บูลีน [] bs = (บูลีน []) วัตถุ;
บัฟ StringBuffer = StringBuffer ใหม่ (“[“);
สำหรับ (int i = 0; i < bs.length; i++) {
buff.append(bs[i] + “,”);
}
buff.deleteCharAt(บัฟความยาว() – 1);
buff.ผนวก(“]”);
กลับ buff.toString();
}
ThrowNoSupprt(วัตถุ, ConvClassName);
}
ThrowNoSupprt(วัตถุ, ConvClassName);
กลับเป็นโมฆะ;
}
/**
*พ่นหากไม่รองรับการแปลง
*
* วัตถุ @param วัตถุที่จะแปลง
* @param convClassName พิมพ์ที่จะแปลง
*/
โมฆะคงที่ส่วนตัว ThrowNoSupprt (วัตถุวัตถุ สตริง convClassName) {
สตริง className = (วัตถุ != null) ? object.getClass().getName()
: "โมฆะ";
String errorMess = “\nยังไม่รองรับการประมวลผลการแปลงประเภทสำหรับออบเจ็กต์นี้\n”
+ ” [ วัตถุ ] = ” + วัตถุ + ”, [ ประเภทวัตถุ ] = ” + ชื่อคลาส
+ “,[ แปลงคลาส ] = ” + ชื่อคลาส ConvClass + “”;
โยน UnsupportedOperationException ใหม่ (errorMess);
}
/**
* แปลงอักขระที่ตำแหน่ง [ดัชนี] ของสตริง [str] เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก
* <p>
* @param str String ที่จะประเมิน
* @param ระบุตำแหน่งดัชนี
* @param toCase แปลงเป็นตัวพิมพ์ใหญ่ ⇒ U | u แปลงเป็นตัวพิมพ์เล็ก ⇒ L | l
* @return String หลังการแปลง
*/
convString สตริงส่วนตัวแบบคงที่ (String str, ดัชนี int, String toCase) {
ถ้า (str == null || str.trim().length() == 0) {
กลับ STR;
} อื่น {
String temp = str.substring (ดัชนี, ดัชนี + 1);
ถ้า (toCase.equalsIgnoreCase (“u”)) {
อุณหภูมิ = temp.toUpperCase();
} อื่น {
อุณหภูมิ = temp.toLowerCase();
}
StringBuffer tempBuffer = StringBuffer ใหม่ (str);
tempBuffer.replace (ดัชนี, ดัชนี + 1, อุณหภูมิ);
กลับ tempBuffer.toString();
}
}
/**
* ตรวจสอบว่า [value] เป็นค่าที่ถูกต้องหรือไม่
*
* @param value String ที่จะประเมิน
* @return [true]: หากไม่เป็นโมฆะและไม่ใช่ “”
*/
isExist บูลีนคงที่ส่วนตัว (ค่าสตริง) {
ถ้า (ค่า != null && value.length() != 0) {
กลับเป็นจริง;
}
กลับเท็จ;
}
/**
* คลาส java.util.Date หรือคลาสย่อยในรูปแบบที่ระบุ
* แปลงเป็นสตริง
* @param date java.util.Date คลาสที่ต้องการแปลง
* รูปแบบที่ระบุรูปแบบ @param
* สตริงวันที่ที่จัดรูปแบบ @return
*/
สตริงคงที่ส่วนตัว toStringDate (วันที่, รูปแบบสตริง) {
SimpleDateFormat sdFormat = SimpleDateFormat ใหม่ (รูปแบบ);
กลับ sdFormat.format (วันที่);
}
java.sql.Date แบบคงที่ส่วนตัว toSqlDate (String strDate) {
ปฏิทิน cal = toCalendar (strDate);
กลับสู่ SqlDate (cal);
}
java.sql.Date แบบคงที่ส่วนตัว toSqlDate (ปฏิทิน cal) {
ยาว l = cal.getTime().getTime();
กลับใหม่ java.sql.Date(l);
}
/**
* แปลงค่าเวลานานเป็นสตริงในรูปแบบที่ระบุ
* @param time ค่ายาวที่แสดงถึงมิลลิวินาทีของเวลาปัจจุบัน
* รูปแบบที่ระบุรูปแบบ @param
* สตริงวันที่ที่จัดรูปแบบ @return
*/
สตริงคงที่ส่วนตัว toStringDate (เวลานาน รูปแบบสตริง) {
กลับไปที่StringDate (วันที่ (เวลา) รูปแบบใหม่);
}
/**
* สตริง ⇒ java.sql.Date
*
* แปลงสตริงวันที่ต่อไปนี้เป็น java.sql.Date
* ปปปป/ดด/วว HH:นน:ss.SSS ปปปป-ดด-วว HH:นน:ss.SSS
*
* “20030407” “2003/04/07” “2003-04-07” “2003/04/07 15:20:16” “2003-04-07
* 15:20:16”
* @param strDate
* @กลับ
*/
ปฏิทินคงที่ส่วนตัว toCalendar (String strDate) {
strDate = รูปแบบ (strDate);
ปฏิทิน 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(ปฏิทิน.HOUR_OF_DAY);
int mm = cal.get(ปฏิทิน.นาที);
int ss = cal.get(ปฏิทิน.วินาที);
int SSS = cal.get(ปฏิทิน.มิลลิวินาที);
cal.ชัดเจน();
cal.set(ปปปป, ดด – 1, วว);
int len = strDate.length();
สวิตช์ (เลน) {
กรณีที่ 10:
หยุดพัก;
กรณีที่ 16: // ปปปป/ดด/วว HH:mm
HH = Integer.parseInt(strDate.substring(11, 13));
มม. = Integer.parseInt(strDate.substring(14, 16));
cal.set(ปฏิทิน.HOUR_OF_DAY, HH);
cal.set(ปฏิทิน.นาที, มม.);
หยุดพัก;
กรณีที่ 19: // ปปปป/ดด/วว HH:mm:ss
HH = Integer.parseInt(strDate.substring(11, 13));
มม. = Integer.parseInt(strDate.substring(14, 16));
เอสเอส = Integer.parseInt(strDate.substring(17, 19));
cal.set(ปฏิทิน.HOUR_OF_DAY, HH);
cal.set(ปฏิทิน.นาที, มม.);
cal.set(ปฏิทิน.วินาที, เอสเอส);
หยุดพัก;
กรณีที่ 23: // ปปปป/ดด/วว HH:mm:ss.SSS
HH = Integer.parseInt(strDate.substring(11, 13));
มม. = Integer.parseInt(strDate.substring(14, 16));
เอสเอส = Integer.parseInt(strDate.substring(17, 19));
SSS = Integer.parseInt(strDate.substring(20, 23));
cal.set(ปฏิทิน.HOUR_OF_DAY, HH);
cal.set(ปฏิทิน.นาที, มม.);
cal.set(ปฏิทิน.วินาที, เอสเอส);
cal.set(ปฏิทิน.มิลลิวินาที, SSS);
หยุดพัก;
ค่าเริ่มต้น:
โยน IllegalStateException ใหม่ (
“สตริงสตริงนี้ไม่สามารถแปลงเป็นสตริงวันที่:”
+strDate);
}
กลับแคล;
}
/**
* สตริงวันที่ใดๆ ที่เป็น “yyyy/MM/dd” หรือ “yyyy/MM/dd HH:mm:ss”
* ความพยายามที่จะแปลงเป็นรูปแบบ
* ตัวอย่าง: 03/01/03 ⇒ 2003/01/03
* @param strDate
* @กลับ
*/
รูปแบบสตริงคงที่ส่วนตัว (String strDate) {
strDate = strDate.trim();
สตริง ปปปป = null;
สตริง MM = null;
สตริง dd = null;
สตริง HH = null;
สตริง mm = null;
สตริง SS = null;
สตริง SSS = null;
// หากไม่มี “-” หรือ “/”
ถ้า (strDate.indexOf("/") == -1 && strDate.indexOf("-") == -1) {
ถ้า (strDate.length() == 8) {
ปปปป = strDate.substring(0, 4);
MM = strDate.สตริงย่อย(4, 6);
dd = strDate.substring(6, 8);
ส่งคืน ปปปป + “/” + MM + “/” + dd;
} อื่น {
ปปปป = strDate.substring(0, 4);
MM = strDate.สตริงย่อย(4, 6);
dd = strDate.substring(6, 8);
HH = strDate.substring(9, 11);
มม. = strDate.substring (12, 14);
เอสเอส = strDate.substring(15, 17);
กลับ ปปปป + “/” + MM + “/” + dd + ” ” + HH + “:” + มม. + “:”
+เอสเอส;
}
}
โทเค็น StringTokenizer = StringTokenizer ใหม่ (strDate, “_/-:. “);
ผลลัพธ์ StringBuffer = StringBuffer ใหม่ ();
สำหรับ (int i = 0; token.hasMoreTokens(); i++) {
อุณหภูมิสตริง = token.nextToken();
สวิตช์ (i) {
กรณี 0:// ปี ส่วน
ปปปป = fillString(strDate, temp, “f”, “20”, 4);
result.ผนวก(yyyy);
หยุดพัก;
กรณีที่ 1:// เดือน ส่วน
MM = fillString(strDate, อุณหภูมิ, “f”, “0”, 2);
result.ผนวก(“/” + MM);
หยุดพัก;
กรณีที่ 2:// ส่วนวัน
dd = fillString(strDate, temp, “f”, “0”, 2);
result.ผนวก(“/” + dd);
หยุดพัก;
กรณีที่ 3:// ส่วนเวลา
HH = fillString(strDate, temp, “f”, “0”, 2);
result.ผนวก(” ” + HH);
หยุดพัก;
กรณีที่ 4:// ส่วนนาที
mm = fillString(strDate, temp, “f”, “0”, 2);
result.ผนวก(“:” + มม.);
หยุดพัก;
กรณีที่ 5:// ส่วนที่สอง
ss = fillString(strDate, temp, “f”, “0”, 2);
result.append(“:” + ss);
หยุดพัก;
กรณีที่ 6:// ส่วนมิลลิวินาที
SSS = fillString(strDate, temp, “b”, “0”, 3);
result.append("." + SSS);
หยุดพัก;
}
}
กลับผลลัพธ์ toString();
}
fillString สตริงคงที่ส่วนตัว (String strDate, String str,
ตำแหน่งสตริง, สตริง addStr, int len) {
ถ้า (str.length() > len) {
String mes = strDate + “สตริงสตริงนี้ไม่สามารถแปลงเป็นสตริงวันที่ได้”;
โยน IllegalStateException ใหม่ (mes);
}
กลับ fillString (str, ตำแหน่ง, addStr, len);
}
/**
* เพิ่มสตริง [addStr] ที่จะเพิ่มลงในสตริง [str] ที่ [ตำแหน่ง] ใน [len]
* ใส่จนเต็ม
* <p>
* ตัวอย่าง: String ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
* *fillString() แทรกจนกระทั่ง len เต็ม แต่ addString() แทรก len
*
* สตริงเป้าหมาย @param str
* ตำแหน่ง @param แทรกก่อน ⇒ F/f แทรกหลัง ⇒ B/b
* @param addStr สตริงที่จะแทรก
* @param len จำนวนหลักที่จะเติม
* @return สตริงหลังการแปลง [str] เป็นค่าว่างหรือว่างเปล่า [addStr] ถูกตั้งค่าเป็น [len]
* ส่งกลับผลลัพธ์ที่แทรกไว้จนกว่าจะพอใจ
*/
fillString สตริงคงที่ส่วนตัว (String str, ตำแหน่งสตริง,
สตริง addStr, int len) {
StringBuffer tempBuffer = null;
ถ้า (!มีอยู่(str)) {
tempBuffer = StringBuffer ใหม่ ();
สำหรับ (int i = 0; i <len; i++) {
tempBuffer.ผนวก (addStr);
}
กลับ tempBuffer.toString();
} อื่นถ้า (str.length() != len) {
tempBuffer = StringBuffer ใหม่ (str);
ในขณะที่ (len > tempBuffer.length()) {
ถ้า (position.equalsIgnoreCase (“f”)) {
tempBuffer.insert (0, addStr);
} อื่น {
tempBuffer.ผนวก (addStr);
}
}
กลับ tempBuffer.toString();
}
กลับ STR;
}
}