Refleksi di Java itu mudah.
JawaのcerminanBagian ini memperkenalkan kelas-kelas utilitas yang memudahkan penggunaan API.
Apa itu refleksi?
API Refleksigigi,"java.lang.reflectItu sudah termasuk dalam paket,
API ini mengambil informasi seperti field dan method dari kelas Java.
Kita akan menggunakan kelas-kelas berikut ini sebagai acuan utama.
- java.lang.Class
- java.lang.reflect.Konstruktor
- java.lang.reflect.Metode
- java.lang.reflect.field
cerminanDengan menggunakan metode ini, Anda dapat menghindari pembuatan kelas dan pemanggilan metode secara langsung melalui pengkodean.
Anda dapat membuat instance kelas dan menjalankan metode dari string.
Dengan mendefinisikan nama kelas dan nama metode dalam file eksternal seperti XML, aplikasi dapat diadaptasi secara dinamis terhadap perubahan lingkungan runtime.
Selain itu, ini adalah API yang sangat efektif untuk membangun aplikasi yang sangat fleksibel.
Tujuan refleksi
cerminanMeskipun pengguna tidak sering menggunakannya secara langsung,
Ini banyak digunakan dalam aplikasi web seperti Struts dan dalam kerangka kerja seperti pemetaan O/R.
Sebagai contoh, ketika Anda ingin secara otomatis mengatur data input dari layar web ke dalam properti JavaBeans,
Ini digunakan, misalnya, saat mengeluarkan kueri SQL untuk memperbarui properti JavaBeans secara otomatis.
Selain itu, fitur-fitur seperti pemuatan dan pendaftaran plugin secara dinamis yang memperluas fungsionalitas aplikasi saat aplikasi dimulai juga tersedia.cerminanHal ini dapat dicapai dengan mudah menggunakan [metode ini].
Menjalankan contoh tersebut
Sekarang, silakan jalankan kode contoh dan rasakan sendiri pemrograman berbasis kerangka kerja.
Di sini kita akan menggunakan kelas-kelas berikut.cerminanIni menunjukkan cara sederhana untuk menggunakan utilitas tersebut.
Main.java...Kelas yang akan dieksekusi
BeanUtil.java...Kelas utilitas refleksi
FreeSoft.java...Ini adalah kelas yang mewakili perangkat lunak bebas dan digunakan sebagai refleksi.
●Saat dieksekusi seperti biasa
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(Obrolan & Messenger - Obrolan dan Messenger juga!!)“);
freeSoft.showName();
freeSoft.showPrice(0);
●Saat dieksekusi menggunakan refleksi
// Buat instance dari kelas FreeSoft
Objek invokeObject = BeanUtil.newInstance("FreeSoft")“);
// Tetapkan nilai untuk kolom nama.
BeanUtil.setProperty(invokeObject, “"nama"” , “"Obrolan & Messenger - Obrolan dan Messenger juga!!"”);
// Menjalankan metode showName() dari FreeSoft.
BeanUtil.invoke(invokeObject, “tampilkanNama”, null);
// Menjalankan metode showPrice() dari FreeSoft.
// Jika metode tersebut memiliki argumen, argumen tersebut harus diteruskan sebagai array bertipe Object.
BeanUtil.invoke(invokeObject, “Tampilkan Harga”,new Object[]{new Integer(0)});
●Hasil eksekusi
Hasil eksekusinya akan sama, baik Anda menggunakan refleksi maupun tidak.
Nama perangkat lunak: Chat&Messenger Obrolan dan pesan instan!
Harga: 0 yen
>>>Saat menggunakan refleksi
Nama perangkat lunak: Chat&Messenger Obrolan dan pesan instan!
Harga: 0 yen
Detail Metode BeanUtil
Instans baru
Objek statis publik Instans baru(String className) melempar Pengecualian
- Ini membuat dan mengembalikan sebuah instance dari string "className".
-
- Parameter:
nama kelas- Nama kelas yang sepenuhnya memenuhi syarat- Nilai kembalian:
- Instansi baru dari nama kelas yang sepenuhnya memenuhi syarat.
- pengecualian:
Pengecualian
Instans baru
Objek statis publik Instans baru(String className, Object[] argObj) throws Exception
- Ini membuat dan mengembalikan sebuah instance dari string "className".
-
- Parameter:
nama kelas- Nama kelas yang sepenuhnya memenuhi syaratargObj– Argumen konstruktor- Nilai kembalian:
- Instansi baru dari nama kelas yang sepenuhnya memenuhi syarat.
- pengecualian:
Pengecualian
Instans baru
Objek statis publik Instans baru(Kelas clazz) melempar Pengecualian
- Ini membuat dan mengembalikan sebuah instance dari kelas "clazz".
-
- Parameter:
Clazz- kelas- Nilai kembalian:
- Contoh baru dari clazz
- pengecualian:
Pengecualian
Instans baru
Objek statis publik Instans baru(Kelas clazz, Objek[] argObj) melempar Pengecualian
- Ini membuat dan mengembalikan sebuah instance dari kelas "clazz".
-
- Parameter:
Clazz- kelasargObj– Argumen konstruktor- Nilai kembalian:
- Contoh baru dari clazz
- pengecualian:
Pengecualian
setProperty
publik statis kosong setProperty(Objek invokeObject, String fieldName, Objek value) melempar Pengecualian
- Metode setter dari field "fieldName" pada objek "invokeObject" dipanggil untuk menyimpan nilai "value".
Jika tidak ada metode setter, nilai akan langsung ditetapkan ke field tersebut. Namun, dalam hal ini, pengubah akses properti target harus publik.
-
- Parameter:
MemanggilObjek- Objek yang akan dieksekusiNama Bidang– Nama properti dari objek yang akan dieksekusiDirekomendasikan– Nilai yang akan ditetapkan- pengecualian:
Pengecualian– Pengecualian berikut terjadi:InvocationTargetException- Ketika metode yang mendasarinya melempar pengecualianPengecualian Akses Ilegal– Objek Metode ini adalah Java
Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diaksesTidak AdaMetodeTersebut- Jika metode dengan nama yang ditentukan tidak ditemukan
mendapatkan properti
Objek statis publik mendapatkan properti(Objek invokeObject, String fieldName) melempar Pengecualian
- Metode getter dari fieldName objek invokeObject dipanggil untuk mengambil nilainya.
Jika tidak ada metode getter, nilai akan diambil langsung dari field tersebut. Namun, dalam hal ini, pengubah akses properti target harus publik. -
- Parameter:
MemanggilObjek- Objek yang akan dieksekusiNama Bidang– Nama properti dari objek yang akan dieksekusi- Nilai kembalian:
- Nilai kembalian metode getter
- pengecualian:
Pengecualian– Pengecualian berikut terjadi:InvocationTargetException- Ketika metode yang mendasarinya melempar pengecualianPengecualian Akses Ilegal– Objek Metode ini adalah Java
Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diaksesTidak Ada Pengecualian Bidang Itu- Jika kolom dengan nama yang ditentukan tidak ditemukan
memohon
Objek statis publik memohon(Objek invokeObject, String callMethod, Object[] argObjects) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
- Ini menjalankan metode "callMethod" dari objek "invokeObject".
Jika ada nilai kembalian, nilai tersebut dapat diperoleh sebagai sebuah Objek. -
- Parameter:
MemanggilObjek- Objek yang akan dieksekusipanggilMetode– Nama metode yang akan dieksekusiargObjects– Jika ada argumen, argumen tersebut diteruskan sebagai array objek. Jika tidak ada argumen, nilai null diteruskan.- Nilai kembalian:
- Nilai kembalian dari eksekusi "callMethod"
- pengecualian:
InvocationTargetException- Ketika metode yang mendasarinya melempar pengecualianPengecualian Akses Ilegal– Objek Metode ini adalah Java
Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diaksesTidak AdaMetodeTersebut- Jika metode dengan nama yang ditentukan tidak ditemukan
temukanMetode
Metode statis publik temukanMetode(Objek invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
- Ini mencari metode "callMethod" dari objek "invokeObject".
-
- Parameter:
MemanggilObjek- Objek yang akan dieksekusipanggilMetode– Nama metode dari objek yang akan dieksekusiargObjects– Jika ada argumen, argumen tersebut diteruskan sebagai array objek. Jika tidak ada argumen, nilai null diteruskan.- Nilai kembalian:
- Objek metode yang sesuai dengan kondisi argumen yang ditentukan.
- pengecualian:
Tidak AdaMetodeTersebut- Jika tidak ditemukan metode yang cocok, atau jika namanya adalah "" atau ""
setField
publik statis kosong setField(Objek invokeObject, String fieldName, Objek value) throws IllegalAccessException, NoSuchFieldException
- Nilai "value" disimpan dalam field bernama "fieldName" dari objek "invokeObject" yang akan dieksekusi.
-
- Parameter:
MemanggilObjek- Objek yang akan dieksekusiNama Bidang– Nama field dari objek yang akan dieksekusiDirekomendasikan– Nilai yang akan ditetapkan- pengecualian:
Pengecualian Akses Ilegal– Objek yang ditentukan adalah field dasar (atau subkelas atau implementasinya).
Jika bukan merupakan instance dari kelas atau antarmuka yang mendeklarasikannya, atau jika konversi pelepasan pembungkus gagal.Tidak Ada Pengecualian Bidang Itu- Jika kolom dengan nama yang ditentukan tidak ditemukan
dapatkanField
Objek statis publik dapatkanField(Objek invokeObject, String fieldName) throws IllegalAccessException, NoSuchFieldException
- Ini mengambil nilai dari nama field "fieldName" dari objek "invokeObject" yang sedang dieksekusi.
-
- Parameter:
MemanggilObjek- Objek yang akan dieksekusiNama Bidang– Nama field dari objek yang akan dieksekusi- Nilai kembalian:
- Nilai kembalian
- pengecualian:
Pengecualian Akses Ilegal– Objek yang ditentukan adalah field dasar (atau subkelas atau implementasinya).
Jika bukan merupakan instance dari kelas atau antarmuka yang mendeklarasikannya, atau jika konversi pelepasan pembungkus gagal.Tidak Ada Pengecualian Bidang Itu- Jika kolom dengan nama yang ditentukan tidak ditemukan
hasField
publik statis boolean hasField(Objek object, String fieldName) melempar Pengecualian
- Ini memeriksa apakah objek "object" telah mendeklarasikan sebuah field bernama "fieldName".
-
- Parameter:
obyek- Objek yang akan diperiksaNama Bidang– Nama bidang yang akan diperiksa- Nilai kembalian:
- Jika dinyatakan benar
- pengecualian:
Pengecualian
Dapatkan Semua Bidang
publik statis java.util.TreeSet Dapatkan Semua Bidang(Objek objek) melempar Pengecualian
-
- Parameter:
obyek–- Nilai kembalian:
- pengecualian:
Pengecualian
mendapatkan nama kelas pendek
publik statis String mendapatkan nama kelas pendek(Objek objek)
- Fungsi ini mengambil nama kelas yang tidak memenuhi syarat dari sebuah objek.
-
- Parameter:
obyek–- Nilai kembalian:
mendapatkan nama kelas pendek
publik statis String mendapatkan nama kelas pendek(String className)
- Ini mengambil nama kelas dari nama yang sepenuhnya memenuhi syarat.
-
- Parameter:
nama kelas–- Nilai kembalian:
GETFieldName
publik statis String GETFieldName(String methodName)
- Ubah nama field dari nama method. Ini harus sesuai dengan konvensi JavaBeans.
-
- Parameter:
nama data–- Nilai kembalian:
isClassExist
publik statis boolean isClassExist(String className)
- Ini memeriksa apakah nama yang sepenuhnya memenuhi syarat "className" adalah nama kelas yang ada.
-
- Parameter:
nama kelas–- Nilai kembalian:
mendapatkanDeskriptorProperti
public static PropertyDescriptor[] mendapatkanDeskriptorProperti(Objek object) melempar IntrospectionException
- Ini mengembalikan PropertyDescriptor yang menyimpan informasi objek dari "object".
-
- Parameter:
obyek–- Nilai kembalian:
- pengecualian:
java.beans.IntrospectionException
Kode sumber BeanUtil
/**
* Kelas utilitas yang memudahkan penggunaan API refleksi Java.
*/
kelas publik BeanUtil {
/** */
privat statis final String GET = “GET”;
/** */
privat statis final String SET = “SET”;
// ———————————————————-『newInstance』
/**
* Membuat dan mengembalikan sebuah instance dari string "className".
* @param className Nama kelas yang sepenuhnya memenuhi syarat
* @return Sebuah instance baru dari nama kelas yang sepenuhnya memenuhi syarat
* @throws Pengecualian
*/
public static Object newInstance(String className) throws Exception {
mencoba {
kembalikan Class.forName(className).newInstance();
} catch (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError : ” + className);
tiga e;
}
}
/**
* Membuat dan mengembalikan sebuah instance dari string "className".
* @param className Nama kelas yang sepenuhnya memenuhi syarat
* @param argObj Argumen konstruktor
* @return Sebuah instance baru dari nama kelas yang sepenuhnya memenuhi syarat
* @throws Pengecualian
*/
public static Object newInstance(String className, Object[] argObj)
melempar Pengecualian {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Konstruktor c = Kelas.forName(className).getConstructor(argClass);
kembalikan c.newInstance(argObj);
}
/**
* Membuat dan mengembalikan sebuah instance dari kelas "clazz".
* @param clazz kelas
* @return Sebuah instance baru dari Sunazz
* @throws Pengecualian
*/
public static Object newInstance(Class clazz) throws Exception {
kembalikan clazz.newInstance();
}
/**
* Membuat dan mengembalikan sebuah instance dari kelas "clazz".
* @param clazz kelas
* @param argObj Argumen konstruktor
* @return Sebuah instance baru dari Sunazz
* @throws Pengecualian
*/
public static Object newInstance(Class clazz, Object[] argObj)
melempar Pengecualian {
Class[] argClass = new Class[argObj.length];
for (int i = 0; i < argObj.length; i++) {
argClass[i] = argObj[i].getClass();
}
Konstruktor c = clazz.getConstructor(argClass);
kembalikan c.newInstance(argObj);
}
// —————————————————————『Metode』
/**
* Metode setter dari field "fieldName" pada objek "invokeObject"
* Memanggil dan menyimpan nilai "value".
* <br>
* Jika tidak ada metode setter, nilai akan langsung ditetapkan ke field tersebut.
* Namun, dalam kasus ini, pengubah akses properti yang dimaksud harus bersifat publik.
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama properti dari objek yang akan dieksekusi.
* @param value Nilai yang akan ditetapkan
* @throws Exception Pengecualian berikut akan terjadi:
* @throws InvocationTargetException ketika metode yang mendasarinya melempar pengecualian
* @throws IllegalAccessException Objek Metode ini adalah Java
* Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diakses.
* @throws NoSuchMethodException jika metode dengan nama yang ditentukan tidak ditemukan.
*/
publik statis void setProperty(Object invokeObject, String fieldName,
Nilai objek) melempar Pengecualian {
mencoba {
Metode method = searchMethod(invokeObject, fieldName, SET);
Kelas[] paramClasses = method.getParameterTypes();
Object[] valueArray = null;
jika (paramClasses[0].isInstance(value)) {
// Jika objek yang akan diatur merupakan subkelas dari kelas argumen, maka objek tersebut tidak akan dikonversi.
valueArray = new Object[] { value };
kalau tidak {
valueArray = new Object[] { convObject(value, paramClasses[0]
.getName()) };
}
metode.invoke(invokeObject, valueArray);
} catch (NoSuchMethodException e) {
mencoba {
// Jika tidak ada metode setter, atur langsung ke field tersebut.
setField(invokeObject, fieldName, value);
} catch (NoSuchFieldException fe) {
String errorMes = “\nClass” + getShortClassName(invokeObject)
+ “adalah untuk bidang `` + FieldName + ``''\n”
+ "Tidak ada metode setter yang dapat diakses, dan."“
+ “Bidang「” + NamaBidang
" + "" juga tidak bersifat publik.;
lemparkan IllegalAccessException baru (errorMes);
}
}
}
/**
* Metode getter dari fieldName objek invokeObject
* Mengambil nilai panggilan. <br>
* Jika tidak ada metode getter, nilai akan diambil langsung dari field tersebut.
* Namun, dalam kasus ini, pengubah akses properti yang dimaksud harus bersifat publik.
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama properti dari objek yang akan dieksekusi.
* @return Nilai kembalian dari metode getter
* @throws Exception Pengecualian berikut akan terjadi:
* @throws InvocationTargetException ketika metode yang mendasarinya melempar pengecualian
* @throws IllegalAccessException Objek Metode ini adalah Java
* Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diakses.
* @throws NoSuchFieldException jika field dengan nama yang ditentukan tidak ditemukan.
*/
public static Object getProperty(Object invokeObject, String fieldName)
melempar Pengecualian {
mencoba {
Metode method = searchMethod(invokeObject, fieldName, GET);
kembalikan metode.invoke(invokeObject, null);
} catch (NoSuchMethodException e) {
kembalikan getField(invokeObject, fieldName);
}
}
/**
* Menjalankan metode "callMethod" dari objek "invokeObject".
* Jika ada nilai kembalian, nilai tersebut dapat diperoleh sebagai Objek.
* @param invokeObject Objek yang akan dipanggil.
* @param callMethod Nama metode yang akan dieksekusi
* @param argObjects Jika ada argumen, berikan argumen tersebut sebagai array objek.
* Jika tidak ada argumen yang diberikan, nilai null akan dilewatkan.
* @return Nilai kembalian dari eksekusi "callMethod"
* @throws InvocationTargetException ketika metode yang mendasarinya melempar pengecualian
* @throws IllegalAccessException Objek Metode ini adalah Java
* Jika kontrol akses bahasa diimplementasikan dan metode yang mendasarinya tidak dapat diakses.
* @throws NoSuchMethodException jika metode dengan nama yang ditentukan tidak ditemukan.
*/
public static Object invoke(Object invokeObject, String callMethod,
Object[] argObjects) throws InvocationTargetException,
IllegalAccessException, NoSuchMethodException {
Metode method = findMethod(invokeObject, callMethod, argObjects);
kembalikan metode.invoke(invokeObject, argObjects);
}
/**
* Mencari metode "callMethod" dari objek "invokeObject".
* @param invokeObject Objek yang akan dipanggil.
* @param callMethod Nama metode dari objek yang akan dieksekusi
* @param argObjects Jika ada argumen, berikan argumen tersebut sebagai array objek.
* Jika tidak ada argumen yang diberikan, nilai null akan dilewatkan.
* @return Objek Metode yang sesuai dengan kondisi argumen yang ditentukan.
* @throws NoSuchMethodException jika tidak ditemukan metode yang cocok.
* Atau namanya adalah “ " atau " "dalam kasus
*/
public static Method findMethod(Object invokeObject, String callMethod,
Object[] argObjects) throws NoSuchMethodException {
Kelas[] paramClasses = null;
Metode[] methods = invokeObject.getClass().getMethods();
top: for (int i = 0; i < methods.length; i++) {
jika (methods[i].getName().equals(callMethod)) {
jika (argObjects == null)
&& methods[i].getParameterTypes().length == 0) {
kembalikan metode[i];
}
jika (argObjects == null) {
melanjutkan;
}
paramClasses = methods[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// Memvalidasi tipe semua daftar parameter dan argumen.
for (int j = 0; j < paramClasses.length; j++) {
Kelas paramClass = paramClasses[j];
Objek argObj = argObjects[j];
// Jika tipe argumennya primitif, maka objek argumen
// bukan null tetapi tipe data primitif
// Atau, subkelas Number apa pun dapat diterima.
jika (argObj == null) {
melanjutkan;
}
jika (paramClass.isPrimitive()
&& (argObj instanceof Number || argObj
.getClass().isPrimitive())) {
melanjutkan;
}
jika (!paramClass.isInstance(argObj)) {
// Jika tidak ada kompatibilitas konversi implisit antara tipe-tipe tersebut, lanjutkan ke metode berikutnya.
Lanjutkan ke atas;
}
}
kembalikan metode[i];
}
}
}
String paramLength = (paramClasses != null) ? Integer
.toString(paramClasses.length) : “”;
String errorMes = getShortClassName(invokeObject) + "Metode"“
+ callMethod + “はありません。” + “[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
lemparkan NoSuchMethodException baru (errorMes);
}
// ----------------------"Bidang"
/**
* Nilai nama field "fieldName" dari objek yang akan dieksekusi "invokeObject" diatur.
* Menyimpan nilai.
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama field dari objek yang akan dieksekusi.
* @param value Nilai yang akan ditetapkan
* @throws IllegalAccessException Objek yang ditentukan didasarkan pada
* Suatu bidang (atau subkelas atau implementasinya)
* Jika bukan merupakan contoh dari kelas atau antarmuka yang mendeklarasikan *
* Atau jika konversi pembukaan kemasan gagal
* @throws NoSuchFieldException jika field dengan nama yang ditentukan tidak ditemukan.
*/
public static void setField(Object invokeObject, String fieldName,
Nilai objek) melempar IllegalAccessException, NoSuchFieldException {
Field field = searchField(invokeObject, fieldName);
String className = field.getType().getName();
Objek convObj = null;
jika (field.getType().isInstance(value)) {
convObj = nilai;
kalau tidak {
convObj = convObject(value, className);
}
field.set(invokeObject, convObj);
}
/**
* Nilai nama field "fieldName" dari objek yang akan dieksekusi "invokeObject"
* Ambil kembali.
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama field dari objek yang akan dieksekusi.
* @return Nilai kembalian
* @throws IllegalAccessException Objek yang ditentukan didasarkan pada
* Suatu bidang (atau subkelas atau implementasinya)
* Jika bukan merupakan contoh dari kelas atau antarmuka yang mendeklarasikan *
* Atau jika konversi pembukaan kemasan gagal
* @throws NoSuchFieldException jika field dengan nama yang ditentukan tidak ditemukan.
*/
public static Object getField(Object invokeObject, String fieldName)
melempar IllegalAccessException, NoSuchFieldException {
Field field = searchField(invokeObject, fieldName);
kembalikan field.get(invokeObject);
}
/**
* Apakah objek "object" mendeklarasikan nama field "fieldName"
* Saya akan memeriksanya.
* @param object Objek yang akan diperiksa
* @param fieldName Nama kolom yang akan diperiksa
* Jika @return dideklarasikan, maka benar
* @throws Pengecualian
*/
boolean publik statis hasField(Object object, String fieldName)
melempar Pengecualian {
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String _fieldName = props[i].getName();
jika (fieldName sama dengan _fieldName)) {
kembalikan nilai benar;
}
}
kembalikan false;
}
/**
*
* @param object
* @kembali
* @throws Pengecualian
*/
public static TreeSet getAllFields(Object object) throws Exception {
TreeSet fieldSet = new TreeSet();
// Dapatkan nama properti dari metode
PropertyDescriptor[] props = getPropertyDescriptors(object);
for (int i = 0; i < props.length; i++) {
String fieldName = props[i].getName();
fieldSet.add(fieldName);
}
// Dapatkan nama properti dari kolom
Field[] fields = object.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
String fieldName = fields[i].getName();
jika (!fieldSet.contains(fieldName)) {
fieldSet.add(fieldName);
}
}
kembalikan fieldSet;
}
/**
*
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama field dari objek yang akan dieksekusi.
* @return Objek Fielded yang sesuai dengan kondisi argumen yang ditentukan.
* @throws NoSuchFieldException jika field dengan nama yang ditentukan tidak ditemukan.
*/
private static Field searchField(Object invokeObject, String fieldName)
melempar NoSuchFieldException {
mencoba {
kembalikan invokeObject.getClass().getField(fieldName);
} catch (NoSuchFieldException e) {
// Cakupan ini diambil dari nama kolom tabel
fieldName = checkFieldName(fieldName);
Field[] fields = invokeObject.getClass().getFields();
for (int i = 0; i < fields.length; i++) {
jika (fields[i].getName().equalsIgnoreCase(fieldName)) {
kembalikan bidang[i];
}
}
lemparkan NoSuchFieldException baru (fieldName);
}
}
// ----------------------" yang lain "
/**
* Mengambil nama kelas yang tidak memenuhi syarat dari sebuah objek.
* @param object
* @kembali
*/
public static String getShortClassName(Object object) {
jika (objek == null) {
kembalikan "null";
}
String name = object.getClass().getName();
kembalikan getShortClassName(name);
}
/**
* Mengambil nama kelas dari nama yang sepenuhnya memenuhi syarat.
* @param className
* @kembali
*/
public static String getShortClassName(String className) {
int index = className.lastIndexOf(“.”);
return className.substring(index + 1);
}
/**
* Ubah nama field dari nama metode. Ini sesuai dengan konvensi JavaBeans.
* Ini wajib.
* @param knowledgeName
* @kembali
*/
public static String getFieldName(String methodName) {
String fieldName = null;
jika (methodName.startsWith("is")) {
fieldName = methodName.substring(2);
kalau tidak {
fieldName = methodName.substring(3);
}
fieldName = convString(fieldName, 0, “L”);
kembalikan NamaBidang;
}
/**
* Ini memeriksa apakah nama yang sepenuhnya memenuhi syarat "className" adalah nama kelas yang ada.
* @param className
* @kembali
*/
public static boolean isClassExist(String className) {
mencoba {
Kelas.forName(className);
kembalikan nilai benar;
} catch (Exception e) {
kembalikan false;
}
}
private final static Map beanInfoCache = new HashMap();
/**
* Mengembalikan PropertyDescriptor yang berisi informasi objek dari "object".
* @param object
* @kembali
* @throws IntrospectionException
*/
public static PropertyDescriptor[] getPropertyDescriptors(Object object)
melempar IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
jika (beanInfo == null) {
beanInfo = Introspector.getBeanInfo(object.getClass());
beanInfoCache.put(object.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass());
kembalikan beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ———————————————『Berikut ini adalah metode privat』
// ————————————————————————–
/**
* Metode akses untuk argumen fieldName dicari berdasarkan PropertyDescriptor.
* @param invokeObject Objek yang akan dipanggil.
* @param fieldName Nama kolom
* @param type Metode getter ⇒ GET Metode getter ⇒ SET
* @return Objek Metode yang sesuai dengan kondisi argumen yang ditentukan.
* @throws NoSuchMethodException jika tidak ditemukan metode yang cocok.
* Atau namanya adalah “ " atau " "”
* dalam kasus
* @throws IntrospectionException
*/
private static Method searchMethod(Object invokeObject, String fieldName,
Tipe string) melempar NoSuchMethodException, IntrospectionException {
Fungsi metode = null;
fieldName = checkFieldName(fieldName);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.length; i++) {
String name = props[i].getName();
jika (!nama sama dengan IgnoreCase(fieldName)) {
melanjutkan;
}
jika (tipe sama dengan GET)) {
metode = props[i].getReadMethod();
kalau tidak {
metode = props[i].getWriteMethod();
}
jika (metode == null) {
melanjutkan;
}
metode pengembalian;
}
// Jika metode tersebut tidak ada.
throw new NoSuchMethodException("Kelas tersebut tidak memiliki metode.")“
+ “(Tidak peka huruf besar/kecil.):” + type.toLowerCase()
+ convString(fieldName, 0, “U”) + “()”);
}
/**
* Memeriksa apakah argumen fieldName adalah nama kolom, dan jika itu adalah nama kolom
* Saya akan mengonversinya kembali.
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ mailaddress = mailAddress
* @param fieldName Nama bidang atau nama kolom
* @return nama bidang
*/
private static String checkFieldName(String fieldName) {
int index = fieldName.indexOf(“_”);
sementara (benar) {
jika (indeks == -1) {
kembalikan NamaBidang;
}
StringBuffer convcloumn = new StringBuffer(fieldName);
kolom konk.hapusKarakterPada(indeks);
fieldName = convcloumn.toString();
index = fieldName.indexOf(“_”);
}
}
/**
* Mengonversi objek yang akan dikonversi ke tipe yang ditentukan oleh convClassName.
*
* @param object Objek yang akan dikonversi
* @param convClassName String kelas dari tipe yang akan dikonversi.
* @return objek yang dikonversi
*/
private static Object convObject(Object object, String convClassName) {
jika (objek == null) {
// Mengonversi ke tipe data primitif akan menghasilkan kesalahan jika mengembalikan nilai null.
// Lingkari angka 0.
jika (convClassName sama dengan "int")) {
kembalikan bilangan bulat baru (0);
} else if (convClassName.equals(“long”)) {
kembalikan Long baru (0);
kalau tidak {
kembalikan null;
}
}
jika (objek.getClass().getName().equals(convClassName)) {
kembalikan objek;
}
// —————————————-『 object instanceof String 』
if (object instanceof String) {
jika (convClassName sama dengan "java.lang.String"))) {
kembalikan objek;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
String str = (String) object;
jika (ada(str)) {
// Ini tidak akan berfungsi kecuali Anda mengonversinya ke BigDecimal terlebih dahulu.
// 1000.00000
BigDecimal big = new BigDecimal(str);
kembalikan Long baru(big.longValue());
kalau tidak {
// Jika str adalah literal shell, nilai awalnya adalah "0".
kembalikan Long baru (0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
kembalikan toSqlDate((String) object);
} else if (convClassName.equals(“java.sql.Timestamp”)) {
Tanggal date = toSqlDate((String) object);
kembalikan Timestamp baru (tanggal.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// Jika str adalah literal shell, nilai awalnya adalah "0".
String str = (String) object;
jika (ada(str)) {
BigDecimal big = new BigDecimal(str);
kembalikan bilangan bulat baru (big.intValue());
kalau tidak {
kembalikan bilangan bulat baru (0);
}
} else if (convClassName.equals(“boolean”)) {
return Boolean.valueOf(object.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
String temp = ((String) object).trim();
// temp.length() == 0の場合0ではなくnullにするのが無難。
if (temp.length() == 0) {
kembalikan null;
kalau tidak {
kembalikan BigDecimal baru (temp);
}
}
throwNoSupprt(object, convClassName);
}
// ———————————『 object instanceof java.sql.Date 』
else if (object instanceof java.sql.Date) {
jika (convClassName sama dengan "java.lang.String"))) {
kembalikan toStringDate((java.sql.Date) object, “yyyy/MM/dd”);
} else if (convClassName.equals(“java.sql.Date”)) {
kembalikan objek;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
kembalikan Timestamp baru (((objek Tanggal)).getTime());
}
throwNoSupprt(object, convClassName);
}
// ————————————-『 object instanceof Timestamp 』
else if (object instanceof Timestamp) {
waktu lama = ((objek stempel waktu)).getTime();
jika (convClassName sama dengan "java.lang.String"))) {
kembalikan toStringDate(waktu, “yyyy/MM/dd HH:mm:ss”);
} else if (convClassName.equals(“java.sql.Date”)) {
kembalikan java.sql.Date(waktu) baru;
} else if (convClassName.equals(“java.sql.Timestamp”)) {
kembalikan objek;
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof Integer 』
else if (object instanceof Integer) {
jika (convClassName sama dengan("java.lang.Integer")
|| convClassName.equals(“int”)) {
kembalikan objek;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
kembalikan new Long(((Integer) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
kembalikan BigDecimal baru (((objek Integer)).intValue());
}
throwNoSupprt(object, convClassName);
}
// ——————————————『 object instanceof Long 』
else if (object instanceof Long) {
jika (convClassName sama dengan("java.lang.Long")
|| convClassName.equals(“long”)) {
kembalikan objek;
} else if (convClassName.equals(“java.lang.String”)) {
return object.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
kembalikan Integer baru (((Long) object).intValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
kembalikan BigDecimal baru (((objek Long)).longValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof Double 』
else if (object instanceof Double) {
jika (convClassName sama dengan "java.lang.String"))) {
// NOMOR KOLOM(8,0)
// Windows Oracle > BigDecimal
// Oracle UNIX > Ganda
BigDecimal big = new BigDecimal(((Double) object).doubleValue());
int scale = big.scale();
jika (skala == 0) {
return big.toString();
kalau tidak {
// Pembulatan tidak didukung jika diperlukan.
throwNoSupprt(object, convClassName);
}
}
jika (convClassName sama dengan("java.lang.Integer")
|| convClassName.equals(“int”)) {
kembalikan Integer baru (((objek Double)).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
kembalikan new Long(((Double) object).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
kembalikan BigDecimal baru (((objek Double)).doubleValue());
}
throwNoSupprt(object, convClassName);
}
// ————————————『 object instanceof BigDecimal 』
else if (object instanceof BigDecimal) {
jika (convClassName sama dengan "java.lang.String"))) {
return object.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“long”)) {
kembalikan Long baru (((objek BigDecimal)).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
kembalikan Integer baru (((BigDecimal) object).intValue());
}
throwNoSupprt(object, convClassName);
}
// —————————————-『 object instanceof byte[] 』
else if (object instanceof byte[]) {
jika (convClassName sama dengan "java.sql.Blob"))) {
kembalikan objek;
}
throwNoSupprt(object, convClassName);
}
// ————————————————『objek adalah Boolean』
else if (object instanceof Boolean) {
jika (convClassName sama dengan "boolean")) {
kembalikan objek;
}
throwNoSupprt(object, convClassName);
}
// ———————————————-『objek adalah boolean[]』
else if (object instanceof boolean[]) {
jika (convClassName sama dengan "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);
buff.append("]");
return buff.toString();
}
throwNoSupprt(object, convClassName);
}
throwNoSupprt(object, convClassName);
kembalikan null;
}
/**
* Akan dilemparkan jika konversi tidak didukung.
*
* @param object Objek yang akan dikonversi
* @param convClassName Tipe yang akan dikonversi
*/
private static void throwNoSupprt(Object object, String convClassName) {
String className = (object != null) ? object.getClass().getName()
: “null”;
String errorMess = "\nKonversi tipe untuk Objek ini belum didukung.\n"“
+ ” [ Objek ] = ” + objek + “,[ Tipe Objek ] = ” + className
+ “,[ convertClass ] = ” + convClassName + “”;
lemparkan UnsupportedOperationException baru (errorMess);
}
/**
* Mengubah karakter pada posisi [indeks] dalam string [str] menjadi huruf besar atau huruf kecil.
* <p>
* @param str String yang akan dievaluasi
* @param index Tentukan posisi
* @param toCase Konversi ke huruf besar ⇒ U | u Konversi ke huruf kecil ⇒ L | l
* @return string yang telah dikonversi
*/
private static String convString(String str, int index, String toCase) {
if (str == null || str.trim().length() == 0) {
kembalikan string;
kalau tidak {
String temp = str.substring(index, index + 1);
jika (toCase.equalsIgnoreCase("u")) {
temp = temp.toUpperCase();
kalau tidak {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = new StringBuffer(str);
tempBuffer.replace(index, index + 1, temp);
return tempBuffer.toString();
}
}
/**
* Ini memverifikasi apakah [nilai] adalah nilai yang valid.
*
* @param value String yang akan dievaluasi
* @return [true]: Jika tidak null dan bukan ""
*/
private static boolean isExist(String value) {
if (value != null && value.length() != 0) {
kembalikan nilai benar;
}
kembalikan false;
}
/**
* Kelas java.util.Date atau subkelasnya dalam format yang ditentukan
* Mengonversi ke string.
* @param date Kelas javautil.Date yang akan dikonversi
* @param pattern Menentukan format
* @returns sebuah string tanggal yang diformat
*/
private static String toStringDate(Date date, String pattern) {
SimpleDateFormat sdFormat = new SimpleDateFormat(pattern);
kembalikan sdFormat.format(tanggal);
}
private static java.sql.Date toSqlDate(String strDate) {
Kalender cal = toCalendar(strDate);
kembali ke SqlDate(cal);
}
private static java.sql.Date toSqlDate(Calendar cal) {
long l = cal.getTime().getTime();
kembalikan java.sql.Date(l) yang baru;
}
/**
* Mengonversi nilai waktu yang lama menjadi string dalam format yang ditentukan.
* @param time Nilai long yang mewakili waktu saat ini dalam milidetik.
* @param pattern Menentukan format
* @returns sebuah string tanggal yang diformat
*/
private static String toStringDate(long time, String pattern) {
kembalikan toStringDate(new Date(time), pattern);
}
/**
* String ⇒ java.sql.Date
*
* Konversikan string tanggal berikut ke 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
* @kembali
*/
private static Calendar toCalendar(String strDate) {
strDate = format(strDate);
Kalender cal = Kalender.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.clear();
cal.set(yyyy, MM – 1, dd);
int len = strDate.length();
saklar (panjang) {
Kasus 10:
merusak;
kasus 16: // yyyy/MM/dd HH:mm
HH = Integer.parseInt(strDate.substring(11, 13));
mm = Integer.parseInt(strDate.substring(14, 16));
cal.set(Calendar.HOUR_OF_DAY, HH);
kal.atur(Kalender.MENIT, mm);
merusak;
kasus 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);
kal.atur(Kalender.MENIT, mm);
cal.set(Calendar.SECOND, ss);
merusak;
kasus 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);
kal.atur(Kalender.MENIT, mm);
cal.set(Calendar.SECOND, ss);
cal.set(Calendar.MILLISECOND, SSS);
merusak;
bawaan:
lemparkan IllegalStateException baru (
“"String ini tidak dapat dikonversi menjadi string tanggal:"”
+ strDate);
}
kembalikan kal;
}
/**
* Setiap string tanggal dapat berupa format "yyyy/MM/dd" atau "yyyy/MM/dd HH:mm:ss"
* Mencoba mengkonversi ke format.
* Contoh: 03/1/3 ⇒ 2003/01/03
* @param strDate
* @kembali
*/
private static String format(String strDate) {
strDate = strDate.trim();
String yyyy = null;
String MM = null;
String dd = null;
String HH = null;
String mm = null;
String ss = null;
String SSS = null;
// Jika tidak ada tanda "-" atau "/"
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);
kembalikan yyyy + “/” + MM + “/” + dd;
kalau tidak {
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);
kembali yyyy + “/” + MM + “/” + dd + ” ” + HH + “:” + mm + “:”
+ ss;
}
}
StringTokenizer token = new StringTokenizer(strDate, “_/-:. “);
StringBuffer result = new StringBuffer();
for (int i = 0; token.hasMoreTokens(); i++) {
String temp = token.nextToken();
beralih (i) {
kasus 0:// bagian tahun
yyyy = fillString(strDate, temp, “f”, “20”, 4);
hasil.tambahkan(yyyy);
merusak;
kasus 1:// bagian bulan
MM = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan("/" + MM);
merusak;
kasus 2:// bagian hari
dd = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan("/" + dd);
merusak;
kasus 3:// bagian waktu
HH = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan(" " + HH);
merusak;
kasus 4:// bagian
mm = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan(":" + mm);
merusak;
kasus 5:// bagian tentang detik
ss = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan(":" + ss);
merusak;
kasus 6:// bagian milidetik
SSS = fillString(strDate, temp, “b”, “0”, 3);
hasil.tambahkan("." + SSS);
merusak;
}
}
return result.toString();
}
privat statis String fillString(String strDate, String str,
String position, String addStr, int len) {
if (str.length() > len) {
String mes = strDate + "String ini tidak dapat dikonversi menjadi string tanggal";
lemparkan IllegalStateException baru (mes);
}
kembalikan fillString(str, position, addStr, len);
}
/**
* String yang akan ditambahkan ke string [str] diatur ke posisi [position] dan kemudian ke [len].
Masukkan hingga penuh.
* <p>
* Contoh: String ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
*Catatan: fillString() menyisipkan string hingga mencapai len, sedangkan addString() menyisipkan string yang sama dengan len.
*
* @param str String target
* @param position Sisipkan sebelum ⇒ F/f Sisipkan setelah ⇒ B/b
* @param addStr String yang akan disisipkan
* @param len Jumlah digit yang akan ditambahkan
* @return String yang telah dikonversi. Jika [str] adalah null atau literal kosong, [addStr] akan dikonversi menjadi [len].
* Mengembalikan hasil penyisipan hingga kondisi terpenuhi.
*/
privat statis String fillString(String str, String position,
String addStr, int len) {
StringBuffer tempBuffer = null;
jika (!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()) {
jika (posisi sama dengan mengabaikan huruf besar/kecil ("f")) {
tempBuffer.insert(0, addStr);
kalau tidak {
tempBuffer.append(addStr);
}
}
return tempBuffer.toString();
}
kembalikan string;
}
}
