Refleksi Java menjadi mudah
JawadaricerminanMemperkenalkan kelas utilitas yang memungkinkan Anda menggunakan API dengan mudah.
Apa itu refleksi?
API Refleksigigi,"Java.lang.reflect” termasuk dalam paket,
Ini adalah API yang mengambil informasi seperti bidang dan metode dari kelas Java.
Kelas-kelas berikut ini terutama digunakan.
- java.lang.Kelas
- java.lang.reflect.Constructor
- java.lang.reflect.Metode
- java.lang.reflect.Field
cerminanDengan menggunakan , Anda dapat membuat kelas atau memanggil metode tanpa harus mengkodekannya secara langsung.
Anda dapat membuat instance kelas dari string atau menjalankan suatu metode.
Dengan menulis definisi nama kelas dan nama metode dalam file eksternal seperti XML, Anda dapat secara dinamis menyesuaikan aplikasi dengan perubahan lingkungan selama runtime.
Ini juga merupakan API yang sangat efektif untuk membangun aplikasi yang sangat fleksibel.
Tujuan refleksi
cerminantidak sering digunakan langsung oleh pengguna,
Ini banyak digunakan dalam aplikasi web seperti Struts dan kerangka kerja seperti pemetaan O/R.
Misalnya, ketika secara otomatis mengatur data input layar web ke properti JavaBeans,
Ini digunakan ketika mengeluarkan SQL yang secara otomatis diperbarui berdasarkan properti JavaBeans.
Selain itu, fungsi seperti memuat dan mendaftarkan plug-in secara dinamis yang memperluas fungsionalitas saat aplikasi dimulai juga tersedia.cerminanHal ini dapat dengan mudah dicapai dengan menggunakan .
Menjalankan sampel
Silakan jalankan contoh dan rasakan pemrograman seperti kerangka kerja.
Di sini kita menggunakan kelas berikutcerminanMenunjukkan penggunaan utilitas yang sederhana.
Main.java...Kelas yang akan dieksekusi
BeanUtil.java...Kelas utilitas refleksi
FreeSoft.java...Digunakan sebagai refleksi di kelas yang mewakili perangkat lunak bebas.
●Bila dijalankan secara normal
FreeSoft freeSoft = FreeSoft baru();
freeSoft.setName(“Obrolan & Messenger Obrolan dan Messenger !!”);
freeSoft.showName();
freeSoft.showPrice(0);
●Saat dieksekusi menggunakan refleksi
//Buat sebuah instance dari kelas FreeSoft
Objek invokeObject = BeanUtil.newInstance(“Perangkat Lunak Gratis”);
//Tetapkan nilai pada kolom nama.
BeanUtil.setProperty(invokeObject, "nama" , “Obrolan & Obrolan Messenger dan Messenger !!”);
// Jalankan metode showName() FreeSoft.
BeanUtil.invoke(invokeObject, “nama acara”, batal);
// Jalankan metode showPrice() FreeSoft.
// Jika metode mempunyai argumen, argumen tersebut harus diteruskan sebagai array tipe Objek.
BeanUtil.invoke(invokeObject, “harga pertunjukan”,Objek baru[]{Integer baru(0)});
●Hasil eksekusi
Hasil eksekusinya sama baik dalam kasus normal maupun saat menggunakan refleksi.
Nama perangkat lunak: Obrolan & Messenger Obrolan dan messenger! !
Harga: 0 yen
>>> Saat menggunakan refleksi
Nama perangkat lunak: Obrolan & Messenger Obrolan dan messenger! !
Harga: 0 yen
Detail metode BeanUtil
contoh baru
objek statis publik contoh baru(String className) memunculkan Pengecualian
- Menghasilkan dan mengembalikan sebuah instance dari string "className".
-
- Parameter:
nama kelas
– Nama kelas yang sepenuhnya memenuhi syarat- Nilai pengembalian:
- Sebuah contoh baru dari nama kelas yang sepenuhnya memenuhi syarat
- pengecualian:
Pengecualian
contoh baru
objek statis publik contoh baru(String className, Object[] argObj) memunculkan Pengecualian
- Menghasilkan dan mengembalikan sebuah instance dari string "className".
-
- Parameter:
nama kelas
– Nama kelas yang sepenuhnya memenuhi syaratargObj
– Argumen konstruktor- Nilai pengembalian:
- Sebuah contoh baru dari nama kelas yang sepenuhnya memenuhi syarat
- pengecualian:
Pengecualian
contoh baru
objek statis publik contoh baru(Kelas clazz) melempar Pengecualian
- Menghasilkan dan mengembalikan sebuah instance dari kelas "clazz".
-
- Parameter:
keren
- kelas- Nilai pengembalian:
- contoh baru clazz
- pengecualian:
Pengecualian
contoh baru
objek statis publik contoh baru(Kelas clazz, Objek[] argObj) memunculkan Pengecualian
- Menghasilkan dan mengembalikan sebuah instance dari kelas "clazz".
-
- Parameter:
keren
- kelasargObj
– Argumen konstruktor- Nilai pengembalian:
- contoh baru clazz
- pengecualian:
Pengecualian
setProperti
kekosongan statis publik setProperti(Objek invokeObject, String fieldName, Nilai objek) memunculkan Pengecualian
- Panggil metode penyetel bidang "fieldName" dari objek "invokeObject" dan simpan nilai "value".
Jika tidak ada metode penyetel, nilai akan ditetapkan langsung ke kolom. Namun, dalam kasus ini, pengubah akses properti target harus bersifat publik.
-
- Parameter:
memanggilObjek
– Objek yang akan dieksekusiNama bidang
– Nama properti objek yang akan dieksekusinilai
– Nilai yang akan ditetapkan- pengecualian:
Pengecualian
– Pengecualian berikut terjadi.InvocationTargetException
– Jika metode yang mendasari memunculkan pengecualianIlegalAccessException
– Objek Metode ini adalah Java
Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diaksesTidak AdaMetodePengecualian
– Jika metode dengan nama yang ditentukan tidak ditemukan
dapatkan Properti
objek statis publik dapatkan Properti(Objek invokeObject, String fieldName) memunculkan Pengecualian
- Memanggil metode pengambil bidang fieldName objek invokeObject untuk mendapatkan nilai.
Jika tidak ada metode pengambil, nilai akan diambil langsung dari kolom. Namun, dalam kasus ini, pengubah akses properti target harus bersifat publik. -
- Parameter:
memanggilObjek
– Objek yang akan dieksekusiNama bidang
– Nama properti objek yang akan dieksekusi- Nilai pengembalian:
- Nilai pengembalian metode pengambil
- pengecualian:
Pengecualian
– Pengecualian berikut terjadi.InvocationTargetException
– Jika metode yang mendasari memunculkan pengecualianIlegalAccessException
– Objek Metode ini adalah Java
Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diaksesTidak Ada Pengecualian Bidang Tersebut
– Jika field dengan nama yang ditentukan tidak ditemukan
memohon
objek statis publik memohon(Objek invokeObject, String callMethod, Object[] argObjects) melempar InvocationTargetException, IllegalAccessException, NoSuchMethodException
- Menjalankan metode "callMethod" dari objek "invokeObject".
Jika ada nilai kembalian, maka dapat diperoleh sebagai Objek. -
- Parameter:
memanggilObjek
– Objek yang akan dieksekusimetode panggilan
– Nama metode yang akan dieksekusiargObjects
– Jika ada argumen, teruskan argumen tersebut sebagai array objek. Jika tidak ada argumen, berikan null.- Nilai pengembalian:
- Nilai kembalian dari mengeksekusi "callMethod"
- pengecualian:
InvocationTargetException
– Jika metode yang mendasari memunculkan pengecualianIlegalAccessException
– Objek Metode ini adalah Java
Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diaksesTidak AdaMetodePengecualian
– Jika metode dengan nama yang ditentukan tidak ditemukan
temukanMetode
metode statis publik temukanMetode(Objek invokeObject, String callMethod, Object[] argObjects) melempar NoSuchMethodException
- Cari metode 'callMethod' dari objek 'invokeObject'.
-
- Parameter:
memanggilObjek
– Objek yang akan dieksekusimetode panggilan
– Nama metode objek yang akan dieksekusiargObjects
– Jika ada argumen, teruskan argumen tersebut sebagai array objek. Jika tidak ada argumen, berikan null.- Nilai pengembalian:
- Objek Metode yang cocok dengan kondisi argumen yang ditentukan
- pengecualian:
Tidak AdaMetodePengecualian
– Jika tidak ditemukan metode yang cocok, atau jika namanya “” atau “”
setField
kekosongan statis publik setField(Objek invokeObject, String fieldName, Nilai objek) melempar IllegalAccessException, NoSuchFieldException
- Menyimpan nilai "value" dalam nama field "fieldName" dari objek yang akan dieksekusi "invokeObject".
-
- Parameter:
memanggilObjek
– Objek yang akan dieksekusiNama bidang
– Nama bidang objek yang akan dieksekusinilai
– Nilai yang akan ditetapkan- pengecualian:
IlegalAccessException
– Bidang yang menjadi dasar objek tertentu (atau subkelas atau pelaksananya)
bukan merupakan turunan dari kelas atau antarmuka yang dideklarasikannya, atau jika konversi pembukaan bungkusnya gagalTidak Ada Pengecualian Bidang Tersebut
– Jika field dengan nama yang ditentukan tidak ditemukan
dapatkanField
objek statis publik dapatkanField(Objek invokeObject, String fieldName) memunculkan IllegalAccessException, NoSuchFieldException
- Mendapatkan nilai nama field "fieldName" dari objek yang akan dieksekusi "invokeObject".
-
- Parameter:
memanggilObjek
– Objek yang akan dieksekusiNama bidang
– Nama bidang objek yang akan dieksekusi- Nilai pengembalian:
- nilai kembalian
- pengecualian:
IlegalAccessException
– Bidang yang menjadi dasar objek tertentu (atau subkelas atau pelaksananya)
bukan merupakan turunan dari kelas atau antarmuka yang dideklarasikannya, atau jika konversi pembukaan bungkusnya gagalTidak Ada Pengecualian Bidang Tersebut
– Jika field dengan nama yang ditentukan tidak ditemukan
hasField
boolean statis publik hasField(Objek objek, String fieldName) memunculkan Pengecualian
- Memeriksa apakah objek 'objek' mendeklarasikan nama bidang 'Namabidang'.
-
- Parameter:
obyek
– Objek yang akan diperiksaNama bidang
– Nama bidang yang akan diperiksa- Nilai pengembalian:
- benar jika dinyatakan
- pengecualian:
Pengecualian
dapatkanSemua Bidang
java.util.TreeSet statis publik dapatkanSemua Bidang(Objek objek) melempar Pengecualian
-
- Parameter:
obyek
–- Nilai pengembalian:
- pengecualian:
Pengecualian
dapatkanShortClassName
String statis publik dapatkanShortClassName(Objek objek)
- Mendapatkan nama kelas yang tidak memenuhi syarat dari suatu objek.
-
- Parameter:
obyek
–- Nilai pengembalian:
dapatkanShortClassName
String statis publik dapatkanShortClassName(String nama kelas)
- Mendapatkan nama kelas dari nama yang sepenuhnya memenuhi syarat.
-
- Parameter:
nama kelas
–- Nilai pengembalian:
dapatkan Nama Bidang
String statis publik dapatkan Nama Bidang(Nama metode string)
- Ubah nama bidang dari nama metode. Harus sesuai dengan konvensi JavaBeans.
-
- Parameter:
nama metode
–- Nilai pengembalian:
adalahClassExist
boolean statis publik adalahClassExist(String nama kelas)
- Memverifikasi bahwa nama "className" yang sepenuhnya memenuhi syarat adalah nama kelas yang ada.
-
- Parameter:
nama kelas
–- Nilai pengembalian:
getPropertyDescriptors
PropertyDescriptor statis publik[] getPropertyDescriptors(Objek objek) melempar IntrospectionException
- Mengembalikan PropertyDescriptor yang menyimpan informasi objek untuk "objek".
-
- Parameter:
obyek
–- Nilai pengembalian:
- pengecualian:
java.beans.IntrospectionException
Kode sumber BeanUtil
/**
* Kelas utilitas yang memungkinkan Anda menggunakan API refleksi Java dengan mudah
*/
kelas publik BeanUtil {
/** */
String akhir statis pribadi GET = “GET”;
/** */
String akhir statis pribadi SET = “SET”;
// ----------------------------------------------- 『Instance baru』
/**
* Menghasilkan dan mengembalikan sebuah instance dari string "className".
* @param className nama kelas yang sepenuhnya memenuhi syarat
* @return instance baru dari nama kelas yang sepenuhnya memenuhi syarat
* @melempar Pengecualian
*/
Obyek statis publik newInstance(String className) melempar Pengecualian {
mencoba {
return Kelas.forName(className).newInstance();
} tangkapan (NoClassDefFoundError e) {
System.err.println(“NoClassDefFoundError : ” + Namakelas);
melempar e;
}
}
/**
* Menghasilkan dan mengembalikan sebuah instance dari string "className".
* @param className nama kelas yang sepenuhnya memenuhi syarat
* Argumen konstruktor @param argObj
* @return instance baru dari nama kelas yang sepenuhnya memenuhi syarat
* @melempar Pengecualian
*/
Objek statis publik newInstance(String className, Objek[] argObj)
melempar Pengecualian {
Kelas[] argClass = Kelas baru[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 instance dari kelas 'clazz'.
* @param kelas clazz
* @return instance baru dari clazz
* @melempar Pengecualian
*/
Objek statis publik newInstance(Kelas clazz) melempar Pengecualian {
kembalikan clazz.newInstance();
}
/**
* Membuat dan mengembalikan instance dari kelas 'clazz'.
* @param kelas clazz
* Argumen konstruktor @param argObj
* @return instance baru dari clazz
* @melempar Pengecualian
*/
Objek statis publik newInstance(Kelas clazz, Objek[] argObj)
melempar Pengecualian {
Kelas[] argClass = Kelas baru[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 penyetel bidang “fieldName” objek “invokeObject”
* Panggil, simpan nilai 'nilai'.
* <br>
* Jika tidak ada metode penyetel, tetapkan nilainya langsung ke kolom.
* Namun, dalam kasus ini, pengubah akses properti target harus bersifat publik.
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName Nama properti dari objek yang akan dieksekusi
* @param nilai nilai yang akan ditetapkan
* @throws Exception Pengecualian berikut terjadi.
* @throws InvocationTargetException jika metode yang mendasari memunculkan pengecualian
* @throws IllegalAccessException Jika objek Metode ini adalah Java
* Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diakses
* @throws NoSuchMethodException jika metode dengan nama yang ditentukan tidak ditemukan
*/
public static void setProperty(Objek invokeObject, String fieldName,
Nilai objek) memunculkan Pengecualian {
mencoba {
Metode metode = metode pencarian(invokeObject, fieldName, SET);
Kelas[] paramClasses = metode.getParameterTypes();
Objek[] valueArray = null;
if (paramClasses[0].isInstance(nilai)) {
//Jangan melakukan konversi jika objek yang akan disetel adalah subkelas dari kelas argumen.
valueArray = Objek baru[] { nilai };
} kalau tidak {
valueArray = Objek baru[] { convObject(nilai, paramClasses[0]
.getName()) };
}
metode.invoke(invokeObject, valueArray);
} tangkapan (NoSuchMethodException e) {
mencoba {
// Jika tidak ada metode penyetel, setel langsung ke kolom.
setField(invokeObject, fieldName, nilai);
} tangkapan (NoSuchFieldException fe) {
String errorMes = “\nKelas” + getShortClassName(invokeObject)
+ “adalah” + “untuk bidang “” + Nama bidang + “”\n”
+ “Tidak ada metode penyetel yang dapat diakses, dan.”
+ “Bidang “” + Nama bidang
+ “” juga tidak bersifat publik. ” + “”;
melempar IllegalAccessException baru(errorMes);
}
}
}
/**
* Metode pengambil bidang fieldNama objek invokeObject
* Dapatkan nilai panggilan. <br>
* Jika tidak ada metode pengambil, nilai akan diperoleh langsung dari lapangan.
* Namun, dalam kasus ini, pengubah akses properti target harus bersifat publik.
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName Nama properti dari objek yang akan dieksekusi
* @return mengembalikan nilai metode pengambil
* @throws Exception Pengecualian berikut terjadi.
* @throws InvocationTargetException jika metode yang mendasari memunculkan pengecualian
* @throws IllegalAccessException Jika objek Metode ini adalah Java
* Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diakses
* @throws NoSuchFieldException jika bidang dengan nama yang ditentukan tidak ditemukan
*/
getProperty Objek statis publik (Objek invokeObject, String fieldName)
melempar Pengecualian {
mencoba {
Metode metode = metode pencarian(invokeObject, fieldName, GET);
metode pengembalian.invoke(invokeObject, null);
} tangkapan (NoSuchMethodException e) {
kembali getField(invokeObject,fieldName);
}
}
/**
* Menjalankan metode "callMethod" dari objek "invokeObject".
* Jika ada nilai kembalian, maka dapat diperoleh sebagai tipe Objek.
* @param invokeObject Objek yang akan dieksekusi
* @param callMethod Nama metode yang akan dieksekusi
* @param argObjects Jika ada argumen, teruskan sebagai array objek.
* Berikan null jika tidak ada argumen.
* @return Mengembalikan nilai dari mengeksekusi "callMethod"
* @throws InvocationTargetException jika metode yang mendasari memunculkan pengecualian
* @throws IllegalAccessException Jika objek Metode ini adalah Java
* Ketika kontrol akses bahasa diterapkan dan metode yang mendasarinya tidak dapat diakses
* @throws NoSuchMethodException jika metode dengan nama yang ditentukan tidak ditemukan
*/
pemanggilan Objek statis publik (Objek invokeObject, String callMethod,
Object[] argObjects) menampilkan InvocationTargetException,
IllegalAccessException, NoSuchMethodException {
Metode metode = findMethod(invokeObject, callMethod, argObjects);
metode pengembalian.invoke(invokeObject, argObjects);
}
/**
* Cari metode 'callMethod' dari objek 'invokeObject'.
* @param invokeObject Objek yang akan dieksekusi
* @param callMethod Nama metode objek yang akan dieksekusi
* @param argObjects Jika ada argumen, teruskan sebagai array objek.
* Berikan null jika tidak ada argumen.
* @return Objek Metode yang cocok dengan kondisi argumen yang ditentukan
* @throws NoSuchMethodException Jika tidak ditemukan metode yang cocok,
* Atau jika namanya “ " atau " "dalam kasus
*/
Metode statis publik findMethod(Objek invokeObject, String callMethod,
Objek[] argObjects) melempar NoSuchMethodException {
Kelas[] paramKelas = null;
Metode[] metode = invokeObject.getClass().getMethods();
atas: for (int i = 0; i < metode.panjang; i++) {
if (metode[i].getName().equals(callMethod)) {
jika (argObjects == null
&& metode[i].getParameterTypes().panjang == 0) {
metode pengembalian[i];
}
jika (argObjects == null) {
melanjutkan;
}
paramClasses = metode[i].getParameterTypes();
if (paramClasses.length == argObjects.length) {
// Validasi semua tipe daftar parameter dan tipe argumen
for (int j = 0; j < paramClasses.length; j++) {
Kelas paramClass = paramClasses[j];
Objek argObj = argObjects[j];
// Jika tipe argumennya primitif, maka objek argumennya
// bukan null dan primitif
//Jika itu adalah subkelas Number, tidak apa-apa.
jika (argObj == nol) {
melanjutkan;
}
jika (paramClass.isPrimitive()
&& (argObj contoh Nomor || argObj
.getClass().isPrimitive())) {
melanjutkan;
}
if (!paramClass.isInstance(argObj)) {
// Lanjutkan ke metode berikutnya ketika tipenya tidak kompatibel dengan konversi implisit
lanjutkan ke atas;
}
}
metode pengembalian[i];
}
}
}
String paramLength = (paramClasses != null) ?Integer
.toString(paramClasses.length) : “”;
String errorMes = getShortClassName(invokeObject) + “metode”
+ callMethod + “Tidak ada.” + “[ paramClasses.length ] = ”
+ paramLength + “,[ argObjects.length ] = ” + argObjects.length
+ “”;
melempar NoSuchMethodException baru(errorMes);
}
// ----------------------"Bidang"
/**
* Nilai untuk nama field "fieldName" dari objek "invokeObject" yang akan dieksekusi
* Menyimpan "nilai".
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName Nama field objek yang akan dieksekusi
* @param nilai nilai yang akan ditetapkan
* @throws IllegalAccessException Jika objek yang ditentukan adalah
* bidang (atau subkelas atau pelaksananya)
* Jika ini bukan turunan dari kelas atau antarmuka, deklarasikan
* atau jika konversi pembukaan bungkus gagal
* @throws NoSuchFieldException jika bidang dengan nama yang ditentukan tidak ditemukan
*/
public static void setField(Objek invokeObject, String fieldName,
Nilai objek) memunculkan IllegalAccessException, NoSuchFieldException {
Bidang bidang = searchField(invokeObject, fieldName);
String className = bidang.getType().getName();
Objek convObj = null;
if (bidang.getType().isInstance(nilai)) {
konvObj = nilai;
} kalau tidak {
convObj = convObject(nilai, nama kelas);
}
bidang.set(invokeObject, convObj);
}
/**
* Tetapkan nilai nama bidang "fieldName" dari objek eksekusi "invokeObject" menjadi
* Mendapatkan.
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName Nama field objek yang akan dieksekusi
* @kembalikan nilai pengembalian
* @throws IllegalAccessException Jika objek yang ditentukan adalah
* bidang (atau subkelas atau pelaksananya)
* Jika ini bukan turunan dari kelas atau antarmuka, deklarasikan
* atau jika konversi pembukaan bungkus gagal
* @throws NoSuchFieldException jika bidang dengan nama yang ditentukan tidak ditemukan
*/
getField Objek statis publik (Objek invokeObject, String fieldName)
melempar IllegalAccessException, NoSuchFieldException {
Bidang bidang = searchField(invokeObject, fieldName);
return field.get(invokeObject);
}
/**
* Periksa apakah objek "objek" mendeklarasikan nama field "fieldName"
* mengonfirmasi.
* @param objek Objek yang akan diperiksa
* @param fieldName Nama bidang yang akan diperiksa
* @return true jika dideklarasikan
* @melempar Pengecualian
*/
hasField boolean statis publik (Objek objek, Nama bidang String)
melempar Pengecualian {
PropertyDescriptor[] props = getPropertyDescriptors(objek);
for (int i = 0; i < props.panjang; i++) {
String _fieldName = alat peraga[i].getName();
if (namabidang.sama dengan(_namabidang)) {
kembali benar;
}
}
kembali salah;
}
/**
*
* @param objek
* @kembali
* @melempar Pengecualian
*/
public static TreeSet getAllFields(Objek objek) melempar Pengecualian {
TreeSet fieldSet = Set Pohon baru();
// Dapatkan nama properti dari metode
PropertyDescriptor[] props = getPropertyDescriptors(objek);
for (int i = 0; i < props.panjang; i++) {
String fieldName = alat peraga[i].getName();
fieldSet.add(Namabidang);
}
// Dapatkan nama properti dari kolom
Bidang[] bidang = objek.getClass().getFields();
for (int i = 0; i < bidang.panjang; i++) {
String fieldName = bidang[i].getName();
if (!fieldSet.contains(fieldName)) {
fieldSet.add(Namabidang);
}
}
kembalikan fieldSet;
}
/**
*
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName Nama field objek yang akan dieksekusi
* @return Mengajukan objek yang cocok dengan kondisi argumen yang ditentukan
* @throws NoSuchFieldException jika bidang dengan nama yang ditentukan tidak ditemukan
*/
Bidang pencarian Bidang statis pribadi (Objek invokeObject, Nama bidang String)
melempar NoSuchFieldException {
mencoba {
kembali invokeObject.getClass().getField(fieldName);
} tangkapan (NoSuchFieldException e) {
// Cakupan ini diperoleh dari nama kolom tabel
fieldName = checkFieldName(namafield);
Bidang[] bidang = invokeObject.getClass().getFields();
for (int i = 0; i < bidang.panjang; i++) {
if (bidang[i].getName().equalsIgnoreCase(fieldName)) {
mengembalikan bidang[i];
}
}
lempar NoSuchFieldException(fieldName);
}
}
// ----------------------" yang lain "
/**
* Dapatkan nama kelas yang tidak memenuhi syarat dari suatu objek.
* @param objek
* @kembali
*/
String statis publik getShortClassName(Objek objek) {
jika (objek == null) {
kembalikan “nol”;
}
Nama string = objek.getClass().getName();
kembalikan getShortClassName(nama);
}
/**
* Dapatkan nama kelas dari nama yang sepenuhnya memenuhi syarat.
* @param namakelas
* @kembali
*/
String statis publik getShortClassName(String className) {
int indeks = namakelas.lastIndexOf(“.”);
return className.substring(indeks + 1);
}
/**
* Ubah nama field dari nama metode. Sesuai dengan konvensi JavaBeans
* diperlukan.
* @param nama metode
* @kembali
*/
String statis publik getFieldName(String methodName) {
String fieldNama = null;
if (methodName.startsWith(“adalah”)) {
fieldName = nama metode.substring(2);
} kalau tidak {
fieldName = nama metode.substring(3);
}
fieldName = convString(fieldName, 0, “L”);
kembalikan nama bidang;
}
/**
* Verifikasi bahwa nama "className" yang sepenuhnya memenuhi syarat adalah nama kelas yang sudah ada.
* @param namakelas
* @kembali
*/
boolean statis publik isClassExist(String className) {
mencoba {
Kelas.untukNama(Namakelas);
kembali benar;
} tangkapan (Pengecualian e) {
kembali salah;
}
}
peta statis akhir pribadi beanInfoCache = new HashMap();
/**
* Mengembalikan PropertyDescriptor yang menyimpan informasi objek untuk "objek".
* @param objek
* @kembali
* @melempar IntrospectionException
*/
PropertyDescriptor statis publik[] getPropertyDescriptors(Objek objek)
melempar IntrospectionException {
BeanInfo beanInfo = (BeanInfo) beanInfoCache.get(object.getClass());
jika (kacangInfo == null) {
beanInfo = Introspektor.getBeanInfo(object.getClass());
beanInfoCache.put(objek.getClass(), beanInfo);
}
// BeanInfo beanInfo = Introspektor.getBeanInfo(objek.getClass());
kembalikan beanInfo.getPropertyDescriptors();
}
// ————————————————————————–
// ---------------- “Metode pribadi di bawah”
// ————————————————————————–
/**
* Cari metode pengakses untuk argumen fieldName berdasarkan PropertyDescriptor.
* @param invokeObject Objek yang akan dieksekusi
* @param fieldName nama bidang
* @param ketik Metode pengambil ⇒ Metode pengambil GET ⇒ SET
* @return Objek Metode yang cocok dengan kondisi argumen yang ditentukan
* @throws NoSuchMethodException Jika tidak ditemukan metode yang cocok,
* Atau jika namanya “ " atau " ”
* dalam kasus
* @melempar IntrospectionException
*/
Metode pencarian statis pribadi (Objek invokeObject, String fieldName,
Tipe string) menampilkan NoSuchMethodException, IntrospectionException {
Metode metode = null;
fieldName = checkFieldName(namafield);
PropertyDescriptor[] props = getPropertyDescriptors(invokeObject);
for (int i = 0; i < props.panjang; i++) {
String nama = alat peraga[i].getName();
if (!name.equalsIgnoreCase(fieldName)) {
melanjutkan;
}
if (ketik.sama dengan(GET)) {
metode = alat peraga[i].getReadMethod();
} kalau tidak {
metode = alat peraga[i].getWriteMethod();
}
jika (metode == nol) {
melanjutkan;
}
metode pengembalian;
}
// Jika metodenya tidak ada.
throw new NoSuchMethodException("Kelas tidak memiliki metode."
+ “(Tidak peka huruf besar-kecil.): ” + type.toLowerCase()
+ convString(Namabidang, 0, “U”) + “()”);
}
/**
* Memeriksa apakah argumen fieldName adalah nama kolom; jika itu adalah nama kolom,
* Konversi kembali.
*
* MAIL_ADDRESS ⇒ MAILADDRESS ↓ alamat surat = alamat surat
* @param fieldName nama kolom atau nama kolom
* @kembalikan nama bidang
*/
String statis pribadi checkFieldName(String fieldName) {
int indeks = namabidang.indexOf(“_”);
sementara (benar) {
jika (indeks == -1) {
kembalikan nama bidang;
}
StringBuffer convclumn = new StringBuffer(fieldName);
convclumn.deleteCharAt(indeks);
fieldName = convclumn.toString();
indeks = namabidang.indexOf(“_”);
}
}
/**
* Mengubah objek yang akan dikonversi, objek, menjadi tipe convClassName.
*
* @param objek Objek yang akan dikonversi
* @param convClassName string kelas tipe yang akan dikonversi
* @kembalikan objek yang dikonversi
*/
Objek statis pribadi convObject(Objek objek, String convClassName) {
jika (objek == null) {
// Mengembalikan null saat mengonversi ke tipe primitif akan menghasilkan kesalahan.
// Jadikan itu pembungkus untuk 0.
if (convClassName.equals(“int”)) {
kembalikan Integer baru (0);
} else if (convClassName.equals(“panjang”)) {
kembalikan Panjang baru (0);
} kalau tidak {
kembalikan nol;
}
}
if (objek.getClass().getName().equals(convClassName)) {
mengembalikan objek;
}
// ------------- 『objek instance dari String』
if (objek instanceof String) {
if (convClassName.equals(“java.lang.String”)) {
mengembalikan objek;
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“panjang”)) {
String str = (String) objek;
jika (ada(str)) {
// Akan buruk jika Anda tidak mengonversinya ke BigDecimal satu kali
// 1000.00000
BigDecimal besar = BigDecimal baru(str);
kembalikan Long baru(big.longValue());
} kalau tidak {
// Jika str adalah literal shell, atur nilai awalnya menjadi “0”
kembalikan Panjang baru (0);
}
} else if (convClassName.equals(“java.sql.Date”)) {
kembali keSqlDate((String) objek);
} else if (convClassName.equals(“java.sql.Stempel Waktu”)) {
Tanggal tanggal = toSqlDate((String) objek);
kembalikan Stempel Waktu baru(tanggal.getTime());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
// Jika str adalah literal shell, atur nilai awalnya menjadi “0”
String str = (String) objek;
jika (ada(str)) {
BigDecimal besar = BigDecimal baru(str);
kembalikan Integer baru(besar.intValue());
} kalau tidak {
kembalikan Integer baru (0);
}
} else if (convClassName.equals(“boolean”)) {
return Boolean.valueOf(objek.toString());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
String temp = ((String) objek).trim();
// Jika temp.length() == 0, aman untuk menyetelnya ke null, bukan 0.
if (temp.panjang() == 0) {
kembalikan nol;
} kalau tidak {
kembalikan BigDecimal(temp) baru;
}
}
throwNoSupprt(objek, convClassName);
}
// —------------------------------------------contoh objek java.sql.Date”
else if (objek instanceof java.sql.Date) {
if (convClassName.equals(“java.lang.String”)) {
return toStringDate((java.sql.Date) objek, “yyyy/MM/dd”);
} else if (convClassName.equals(“java.sql.Date”)) {
mengembalikan objek;
} else if (convClassName.equals(“java.sql.Stempel Waktu”)) {
kembalikan Stempel Waktu baru(((Tanggal) objek).getTime());
}
throwNoSupprt(objek, convClassName);
}
// ————————————- 『contoh objek Stempel Waktu』
else if (objek instanceof Timestamp) {
lama = ((Stempel Waktu) objek).getTime();
if (convClassName.equals(“java.lang.String”)) {
return toStringDate(waktu, “yyyy/MM/dd HH:mm:ss”);
} else if (convClassName.equals(“java.sql.Date”)) {
kembalikan java.sql.Date(waktu);
} else if (convClassName.equals(“java.sql.Stempel Waktu”)) {
mengembalikan objek;
}
throwNoSupprt(objek, convClassName);
}
// ------------- 『objek instance dari Integer』
else if (objek instance dari Integer) {
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
mengembalikan objek;
} else if (convClassName.equals(“java.lang.String”)) {
mengembalikan objek.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“panjang”)) {
mengembalikan objek Long(((Integer) baru).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
mengembalikan objek BigDecimal(((Integer) baru).intValue());
}
throwNoSupprt(objek, convClassName);
}
// —————————————— 『objek instance dari Long』
else if (contoh objek Panjang) {
if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“panjang”)) {
mengembalikan objek;
} else if (convClassName.equals(“java.lang.String”)) {
mengembalikan objek.toString();
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
mengembalikan Integer baru(((Panjang) objek).intValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
kembalikan BigDecimal(((Panjang) objek).longValue());
}
throwNoSupprt(objek, convClassName);
}
// ------------- 『objek instance dari Double』
else if (objek instanceof Double) {
if (convClassName.equals(“java.lang.String”)) {
// NOMOR KOLOM(8,0)
// windows Oracle > Desimal Besar
// Oracle UNIX > Ganda
BigDecimal besar = BigDecimal baru(((Ganda) objek).doubleValue());
int skala = besar.skala();
jika (skala == 0) {
kembalikan besar.toString();
} kalau tidak {
// Tidak didukung jika pembulatan diperlukan.
throwNoSupprt(objek, convClassName);
}
}
if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
mengembalikan Integer baru(((Double) objek).intValue());
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“panjang”)) {
mengembalikan objek Long(((Double) baru).longValue());
} else if (convClassName.equals(“java.math.BigDecimal”)) {
kembalikan BigDecimal(((Double) objek).doubleValue());
}
throwNoSupprt(objek, convClassName);
}
// --------------------------- “contoh objek dari BigDecimal ”
else if (objek instance dari BigDecimal) {
if (convClassName.equals(“java.lang.String”)) {
mengembalikan objek.toString();
} else if (convClassName.equals(“java.lang.Long”)
|| convClassName.equals(“panjang”)) {
mengembalikan objek Long(((BigDecimal) baru).longValue());
} else if (convClassName.equals(“java.lang.Integer”)
|| convClassName.equals(“int”)) {
mengembalikan objek Integer(((BigDecimal) baru).intValue());
}
throwNoSupprt(objek, convClassName);
}
// ------------- 『objek instance dari byte[]』
else if (objek instanceof byte[]) {
if (convClassName.equals(“java.sql.Blob”)) {
mengembalikan objek;
}
throwNoSupprt(objek, convClassName);
}
// --------------------------------------------------- “objeknya adalah Boolean”
else if (contoh objek Boolean) {
if (convClassName.equals(“boolean”)) {
mengembalikan objek;
}
throwNoSupprt(objek, convClassName);
}
// ---------------『objeknya boolean[]』
else if (objek instanceof boolean[]) {
if (convClassName.equals(“java.lang.String”)) {
boolean[] bs = (boolean[]) objek;
Penggemar StringBuffer = StringBuffer baru(“[“);
for (int i = 0; i < bs.panjang; i++) {
buff.append(bs[i] + “,”);
}
buff.deleteCharAt(buff.panjang() – 1);
buff.append(“]”);
kembalikan buff.toString();
}
throwNoSupprt(objek, convClassName);
}
throwNoSupprt(objek, convClassName);
kembalikan nol;
}
/**
*Melempar jika konversi tidak didukung.
*
* @param objek Objek yang akan dikonversi
* @param convClassName Ketik untuk mengonversi
*/
private static void throwNoSupprt(Objek objek, String convClassName) {
String className = (objek != null) ?objek.getClass().getName()
: “batal”;
String errorMess = “\nJenis pemrosesan konversi untuk Objek ini belum didukung.\n”
+ ” [ Objek ] = ” + objek + “,[ Jenis objek ] = ” + Nama kelas
+ “,[ convertClass ] = ” + convClassName + “”;
lempar UnsupportedOperationException(errorMess);
}
/**
* Mengonversi karakter pada posisi [indeks] string [str] menjadi huruf besar atau kecil.
* <p>
* @param str String yang akan dievaluasi
* @param indeks Posisi yang ditentukan
* @param toCase Ubah ke huruf besar ⇒ U | u Ubah ke huruf kecil ⇒ L | l
* @return String setelah konversi
*/
konvString String statis pribadi(String str, int indeks, String toCase) {
if (str == null || str.trim().length() == 0) {
kembalikan str;
} kalau tidak {
String temp = str.substring(indeks, indeks + 1);
if (toCase.equalsIgnoreCase(“u”)) {
temp = temp.toUpperCase();
} kalau tidak {
temp = temp.toLowerCase();
}
StringBuffer tempBuffer = StringBuffer baru(str);
tempBuffer.replace(indeks, indeks + 1, suhu);
kembalikan tempBuffer.toString();
}
}
/**
* Verifikasi apakah [nilai] adalah nilai yang valid.
*
* @param value String yang akan dievaluasi
* @return [benar]: Jika bukan null dan bukan “”
*/
boolean statis pribadi isExist(Nilai string) {
if (nilai != null && nilai.panjang() != 0) {
kembali benar;
}
kembali salah;
}
/**
* Kelas java.util.Date atau subkelasnya dalam format yang ditentukan
* Konversikan ke string.
* @param date kelas Java.util.Date yang akan dikonversi
* Format yang ditentukan pola @param
* @return string tanggal yang diformat
*/
private static String toStringDate(Tanggal tanggal, pola String) {
SimpleDateFormat sdFormat = new SimpleDateFormat(pola);
return sdFormat.format(tanggal);
}
java.sql.Date statis pribadi toSqlDate(String strDate) {
Kalender cal = toCalendar(strDate);
kembali keSqlDate(cal);
}
private static java.sql.Date toSqlDate(Calendar cal) {
panjang l = cal.getTime().getTime();
kembalikan java.sql.Date(l);
}
/**
* Mengonversi nilai waktu lama menjadi string dalam format yang ditentukan.
* @param time Nilai panjang yang mewakili milidetik waktu saat ini.
* Format yang ditentukan pola @param
* @return string tanggal yang diformat
*/
private static String toStringDate(lama, pola String) {
return toStringDate(Tanggal baru(waktu), pola);
}
/**
* String ⇒ java.sql.Tanggal
*
* Ubah string tanggal berikut menjadi 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
*/
Kalender statis pribadi toCalendar(String strDate) {
strTanggal = format(strTanggal);
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(Kalender.HOUR_OF_DAY);
int mm = cal.get(Kalender.MINUTE);
int ss = cal.get(Kalender.SECOND);
int SSS = cal.get(Kalender.MILLISECOND);
cal.clear();
cal.set(yyyy, MM – 1, hh);
int len = strDate.length();
saklar (len) {
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(Kalender.HOUR_OF_DAY, HH);
cal.set(Kalender.MINUTE, 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(Kalender.HOUR_OF_DAY, HH);
cal.set(Kalender.MINUTE, mm);
cal.set(Kalender.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(Kalender.HOUR_OF_DAY, HH);
cal.set(Kalender.MINUTE, mm);
cal.set(Kalender.SECOND, ss);
cal.set(Kalender.MILLISECOND, SSS);
merusak;
bawaan:
melempar IllegalStateException baru(
“String string ini tidak dapat dikonversi menjadi string tanggal:”
+strTanggal);
}
kembalikan kal;
}
/**
* String tanggal apa pun sebagai “yyyy/MM/dd” atau “yyyy/MM/dd HH:mm:ss”
* Upaya untuk mengkonversi ke format.
* Contoh: 01/03/03 ⇒ 01/03/2003
* @param strDate
* @kembali
*/
format String statis pribadi(String strDate) {
strTanggal = strTanggal.trim();
String yyyy = nol;
String MM = nol;
String dd = nol;
String HH = nol;
String mm = nol;
String ss = nol;
String SSS = nol;
// Jika “-” atau “/” tidak ada
if (strDate.indexOf(“/”) == -1 && strDate.indexOf(“-“) == -1) {
if (strTanggal.panjang() == 8) {
yyyy = strDate.substring(0, 4);
MM = strDate.substring(4, 6);
dd = strDate.substring(6, 8);
kembali tttt + “/” + MM + “/” + hh;
} 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 tttt + “/” + MM + “/” + hh + ” ” + HH + “:” + mm + “:”
+ss;
}
}
Token StringTokenizer = StringTokenizer baru(strDate, “_/-:. “);
Hasil StringBuffer = StringBuffer baru();
untuk (int i = 0; token.hasMoreTokens(); i++) {
String suhu = 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 menit
mm = fillString(strDate, temp, “f”, “0”, 2);
hasil.tambahkan(“:” + mm);
merusak;
kasus 5:// bagian kedua
ss = fillString(strTanggal, suhu, “f”, “0”, 2);
hasil.tambahkan(“:” + ss);
merusak;
kasus 6:// bagian milidetik
SSS = fillString(strDate, temp, “b”, “0”, 3);
hasil.tambahkan(“.” + SSS);
merusak;
}
}
kembalikan hasil.toString();
}
String statis pribadi fillString(String strDate, String str,
Posisi string, String addStr, int len) {
if (str.panjang() > len) {
String mes = strDate + “String String ini tidak dapat diubah menjadi string tanggal”;
membuang IllegalStateException(mes);
}
kembalikan fillString(str, posisi, addStr, len);
}
/**
* Tambahkan string [addStr] yang akan ditambahkan ke string [str] pada [posisi] di [len]
* Masukkan hingga penuh.
* <p>
* Contoh: String ss = StringUtil.fillString(“aaa”,”b”,”0″,7); ss ⇒ “aaa0000”
*
* *fillString() menyisipkan hingga len terisi, tetapi addString() menyisipkan len.
*
* @param str string target
* @param position Sisipkan sebelum ⇒ F/f Sisipkan setelah ⇒ B/b
* @param addStr String untuk disisipkan
* @param len Jumlah digit yang akan diisi ulang
* @return String setelah konversi. [str] adalah null atau literal kosong, [addStr] disetel ke [len]
* Mengembalikan hasil yang dimasukkan hingga puas.
*/
String statis pribadi fillString(String str, posisi String,
String addStr, ke dalam len) {
StringBuffer tempBuffer = nol;
jika (!isExist(str)) {
tempBuffer = StringBuffer baru();
untuk (int saya = 0; saya < len; saya++) {
tempBuffer.append(addStr);
}
kembalikan tempBuffer.toString();
} lain jika (str.panjang() != len) {
tempBuffer = StringBuffer baru(str);
while (len > tempBuffer.length()) {
if (posisi.equalsIgnoreCase(“f”)) {
tempBuffer.insert(0, addStr);
} kalau tidak {
tempBuffer.append(addStr);
}
}
kembalikan tempBuffer.toString();
}
kembalikan str;
}
}