1. Refleksi di Jawa
1. Muat Atribut Kelas dan Metode Contoh Kode Melalui Refleksi:
/*** java.lang.class adalah sumber refleksi* Kami membuat kelas dan menghasilkan file kelas yang sesuai dengan menyusun (javac.exe). Setelah kami memuat (JVM's Class Loader) File kelas ini* Setelah file kelas ini dimuat ke dalam memori, ini adalah kelas runtime dengan area cache. Kelas runtime ini adalah instance dari kelas * Setiap kelas runtime hanya dimuat sekali, */ class <sahenamxam> clazz = studentexam.class; Studentexam Studentexam = clazz.newinstance (); System.err.println (Studentexam); System.out.println (clazz); // Field Field = Clazz.GetField ("ID"); // Panggil atribut yang ditentukan dari kelas runtime melalui atribut: atributnya adalah bidang tipe publik bidang = clazz.getDeclaredfield ("id"); // Atributnya adalah bidang tipe non-publik [] bidang = clazz.getDeclaredFields (); // Dapatkan semua properti yang dinyatakan dari kelas runtime itu sendiri (kelas induk tidak bisa lakukan). Kelas induk menggunakan clazz.getFields (); untuk (bidang bidang2: bidang) {int i = field2.getModifiers (); String type = Modifier.toString (i); // Dapatkan tipe data bidang atribut bidang.out.println (type); } field.setAccessible (true); field.set (Studentexam, 11); System.err.println (studentexam.getId ()); // Panggil metode yang ditentukan dari kelas runtime melalui metode refleksi = clazz.getMethod ("setid", integer.class); Method.invoke (Studentexam, 123); // Panggil metode yang ditentukan dari metode kelas runtime [] Metode = clazz.getMethods (); // Dapatkan semua metode yang dinyatakan sebagai publik di semua kelas runtime dan metode kelas induknya [] metode2 = clazz.getDeclaredMethods (); // Dapatkan metode yang dinyatakan dalam kelas runtime itu sendiri untuk (metode metode2: metode) {System.out.println (method2.getName ()); } // * Dapatkan kelas runtime objek melalui metode getClass () dari objek, Ujian Ujian = Ujian baru (); Class clazzexam = uji.getClass ();2. ClassLoader
/** * Deskripsi: class loader, muat file xx.properties, dan baca data * @param * @author xiazhongwei * @data 29 September 2016: 5:32:56 pm * @return */public void classloader () melempar IoException {// metode 1. LOADLOADER PUBLICLOADER (METODE LOADLASS LOADRASS (). // Path ditulis di bawah paket: com // mampu // onlinexam // sumber daya // config.properties inputStream instream = loader.getResourceAsstream ("config.properties"); // Metode 2. Muat file dari path yang ditentukan // FileInputStream FileInputStream = new fileInputStream (file baru ("config.properties")); Properti properti = properti baru (); properties.load (instream); // properties.load (fileInputStream); String prop = properties.getProperty ("domain"); System.out.println (prop); }3. Proxy Dinamis
Proksi Statis: Jenis -jenis kelas proksi dan objek target ditentukan selama kompilasi, yang tidak kondusif untuk perluasan program. Pada saat yang sama, setiap kelas proksi hanya dapat melayani satu antarmuka, sehingga terlalu banyak proxy pasti akan terjadi dalam pengembangan program.
Dynamic Proxy: Klien memanggil metode objek lain melalui kelas proxy, dan secara dinamis membuat objek proxy dari kelas target sesuai kebutuhan saat program berjalan.
Prinsip Pola Desain Agen:
Gunakan proxy untuk membungkus objek, dan kemudian ganti objek asli dengan objek proxy itu. Panggilan apa pun ke objek asli harus melalui proxy, apakah dan ketika objek proxy menentukan apakah dan kapan metode dipanggil
paket com.test.junit; impor java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; Public Class ProxyTest {public static void main (string [] args) {realsubject realsubject = new realsubject (); MyinvocationHandler myinvocationHandler = myinvocationHandler baru (); Objek objek = myInvocationHandler.bind (realsubject); Subjek Subjek = (Subjek) Objek; subjek.action (); }} // Penggunaan subjek antarmuka proxy dinamis {void action ();} // kelas realsubject mengimplementasikan subjek {@Override public void action () {System.out.println ("I Am The Proxy Class, ingat untuk mengeksekusi saya ..."); }} kelas myInvocationHandler mengimplementasikan InvocationHandler {objek objek; // deklarasi objek kelas proxy antarmuka/ ** * Deskripsi: ① instantiate objek proxy ② kembalikan objek kelas proxy * @param * @Author xiazhongwei * @data 29, 2016: 4:4:4:4:13: 4:13: pm * pm * pm * @data 29, 2016: 4:4:4:4:4:4:13 this.object = objek; return proxy.newproxyInstance (object.getClass (). getClassLoader (), object.getClass (). getInterfaces (), this); } / ** * Ketika panggilan ke metode yang ditulis ulang dimulai melalui objek kelas proxy, itu akan dikonversi menjadi panggilan ke metode Invok berikut * / @Override Objek publik Invoke (objek proxy, metode metode, objek [] args) melempar lempar {objek returnject = method.invoke (objek, args); return returnObject; }}4. Dinamis Proxy dan AOP
Contoh 1.
paket com.atguigu.spring.aop; Public Interface ArithmeticCalculator {int add (int i, int j); int sub (int i, int j); int mul (int i, int j); int div (int i, int j);} paket com.atguigu.spring.aop; impor org.springframework.stereotype.component; @Component ("ArithmeticCalculator") Kelas Publik ArithmeticCalculatorImpl mengimplementasikan arithmeticCalculator {@Override public int add (int i, int j) {int result = i + j; hasil pengembalian; } @Override public int sub (int i, int j) {int result = i - j; hasil pengembalian; } @Override public int Mul (int i, int j) {int result = i * j; hasil pengembalian; } @Override public int div (int i, int j) {int result = i / j; hasil pengembalian; }} paket com.atguigu.spring.aop; Kelas Publik ArithmeticCalCulatorLoggingImpl mengimplementasikan arithmeticCalculator {@Override public int add (int i, int j) {System.out.println ("Metode add dimulai dengan [" + i + "," + j + "]"); Hasil int = i + j; System.out.println ("Metode menambahkan ujung dengan" + hasil); hasil pengembalian; } @Override public int sub (int i, int j) {System.out.println ("Sub Metode dimulai dengan [" + i + "," + j + "]"); Hasil int = i - j; System.out.println ("Sub Metode diakhiri dengan" + Hasil); hasil pengembalian; } @Override Public int MUL (int i, int j) {System.out.println ("Metode Mul dimulai dengan [" + i + "," + j + "]"); Hasil int = i * j; System.out.println ("Metode Mul dimulai dengan [" + i + "," + j + "]"); Hasil int = i * j; System.out.println ("Metode MUL berakhir dengan" + hasil); hasil pengembalian; } @Override public int div (int i, int j) {System.out.println ("Metode div dimulai dengan [" + i + "," + j + "]"); Hasil int = i / j; System.out.println ("Metode Div berakhir dengan" + hasil); hasil pengembalian; }} paket com.atguigu.spring.aop; impor java.lang.reflect.invocationHandler; impor java.lang.reflect.method; impor java.lang.reflect.proxy; import java.util.arrays; kelas publik ArithmeticCalculatorLoggingProxy {// objek menjadi target proxy proxy arithmeticCalculator; ArithmeticCalculatorLoggingProxy publik (target arithmeticCalculator) {super (); this.target = target; } // kembalikan objek proxy aritmeticCalculator getLoggingProxy () {arithmeticCalculator proxy = null; // Loader kelas mana dari objek proxy yang bertanggung jawab untuk memuat classloader loader = target.getClass (). GetClassLoader (); // Jenis objek proxy, yaitu metode apa yang ada di dalamnya. Class [] antarmuka = kelas baru [] {arithmeticCalculator.class}; // Saat memanggil metode objek proxy, jalankan Code InvocationHandler berikut h = new InvocationHandler () { /*** Proxy: Proxy Object. Objek ini umumnya tidak digunakan* metode: metode yang disebut* args: parameter yang dilewati dalam metode panggilan*/ @Override objek publik Invoke (objek proxy, metode metode, objek [] args) melempar lemparan {// metode objek proxy tidak akan dipanggil langsung di dalam metode. proxy.toString () akan menyebabkan loop dead untuk memanggil Metode Invoke string methodName = method.getName (); // Cetak log System.out.println ("[Sebelum] metode" + MethodName + "dimulai dengan" + arrays.aslist (args)); // Memanggil Hasil Objek Metode Target = NULL; coba {// hasil pra-notifikasi = method.invoke (target, args); // pemberitahuan pengembalian, Anda dapat mengakses nilai pengembalian metode} catch (nullpointerException e) {e.printstacktrace (); // Pemberitahuan Pengecualian, Anda dapat mengakses pengecualian metode} // pasca-notifikasi. Karena metode ini mungkin memiliki pengecualian, nilai pengembalian metode ini tidak dapat diakses // cetak log sistem.out.println ("[Setelah] metode berakhir dengan" + hasil); hasil pengembalian; }}; /*** Loader: Loader kelas yang digunakan oleh objek proxy. * Antarmuka: Tentukan jenis objek proxy. Artinya, metode apa yang dapat ditemukan di objek proxy proxy. * h: Saat memanggil metode objek proxy, bagaimana seharusnya merespons? Faktanya, itu adalah untuk memanggil metode Invoke dari InvocationHandler*/ proxy = (ArithmeticCalculator) Proxy.NewProxyInstance (Loader, Interfaces, H); Return proxy; }} paket com.atguigu.spring.aop; impor org.springframework.context.applicationContext; impor org.springframework.context.support.classpathxmlappLicationContext; kelas publik {public static void main (string [] args) {// arithmeticCalculator arithmeticCalculator = aritmeticCalculatorImpl baru (); ArithmeticCalculator ArithmeticCalculator = ArithmeticCalculatorloggingImpl baru baru (); ArithmeticCalculator = ArithmateCalculatorLoggingProxy baru (ArithmeticCalculator) .getLoggingProxy (); hasil int = aritmatikaCalculator.add (11, 12); System.out.println ("Hasil:" + Hasil); Hasil = ArithmeticCalculator.div (21, 3); System.out.println ("Hasil:" + Hasil); }}Contoh 2.
paket com.test.junit; impor java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; Public Class ProxyTest {public static void main (string [] args) {realsubject realsubject = new realsubject (); MyinvocationHandler myinvocationHandler = myinvocationHandler baru (); Objek objek = myInvocationHandler.bind (realsubject); Subjek Subjek = (Subjek) Objek; subjek.action (); }} // Penggunaan subjek antarmuka proxy dinamis {void action ();} // kelas realsubject mengimplementasikan subjek {@Override public void action () {System.out.println ("I Am The Proxy Class, ingat untuk mengeksekusi saya ..."); }} kelas myInvocationHandler mengimplementasikan InvocationHandler {objek objek; // deklarasi objek kelas proxy antarmuka/ ** * Deskripsi: ① instantiate objek proxy ② kembalikan objek kelas proxy * @param * @Author xiazhongwei * @data 29, 2016: 4:4:4:4:13: 4:13: pm * pm * pm * @data 29, 2016: 4:4:4:4:4:4:13 this.object = objek; return proxy.newproxyInstance (object.getClass (). getClassLoader (), object.getClass (). getInterfaces (), this); } / ** * Ketika panggilan ke metode yang ditulis ulang dimulai melalui objek kelas proxy, itu akan dikonversi menjadi panggilan ke metode Invok berikut * / @Override Objek publik Invoke (objek proxy, metode metode, objek [] args) melempar lempar {objek returnject = method.invoke (objek, args); return returnObject; }}Terima kasih telah membaca artikel ini, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!