日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java反射的使用概览

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反射的使用概览 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

額,研究過這個的人很多很多,但是我沒有很深入的研究過,所以誰也攔不住我去研究研究,然后記錄下來······如有雷同··那就雷同了···請多多包涵。

?

首先是整個項目的結構:

?

?

使用到的類:

?

package reflect.demo;public class Demo {}

?

package reflect.person;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@AllArgsConstructor @NoArgsConstructor public @Data class Person {private String name;private int age;public Person(int age) {super();this.age = age;}public Person(String name) {super();this.name = name;}}

?

?

?

?

?

?

package reflect.person1;public interface China {public static final String name = "xxxxx";public static int age = 12;public void sayChina();public void sayHello(String name, int age); }

?

?

?

?

?

?

package reflect.person1;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;@Data @NoArgsConstructor @AllArgsConstructor public class Person1 implements China {private String sex;@Overridepublic void sayChina() {System.out.println("hello,china");}@Overridepublic void sayHello(String name, int age) {System.out.println(name + "---" + age);}}

?

?

?

?

?

?

package reflect;import lombok.Getter; import lombok.Setter;public class HelloOriginal {@Getter@Setterprivate static Class<?> demo;static {try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }

?

?

?

?

?

?

1.凡是程序,都以HELLOWORLD來開始,貌似誰也避免不了哩。

?

package reflect.test1;import reflect.demo.Demo;/*** @author Administrator 通過一個對象獲得完整的包名和類名*/ public class Hello {public static void main(String[] args) {Demo demo = new Demo();System.out.println(demo.getClass().getName());} }

?

?

?

這是反射的最最基礎的東西了吧,我新建了一個對象,并且通過這個對象來獲得它的class,有了class以后,我就可以操作class的相關信息了,這里我打印出了這個class的name屬性。

這里就很容易的理解了反射,反射反射就是反過來搞。我們總是通過類來創建對象,而現在我們通過一個特定的對象(有時候我們不知道這個對象所屬什么類)獲得了它所歸屬的類的相關信息。

運行結果:

?

2.創建class對象的三種方式

?

package reflect.test2;import reflect.demo.Demo;/*** @author Administrator 實例化Class類對象**/ public class Hello {public static void main(String[] args) {Class<?> demo1 = null;// Class<?>是一種泛型的表達,意思是Object類及其子類都可以放Class<?> demo2 = null;Class<?> demo3 = null;try {// 一般使用的方式,通過指定特定的名稱來創建classdemo1 = Class.forName("reflect.demo.Demo");} catch (Exception e) {e.printStackTrace();}demo2 = new Demo().getClass();//通過一個對象來獲得classdemo3 = Demo.class;//通過類來獲得classSystem.out.println("類名稱 " + demo1.getName());System.out.println("類名稱 " + demo2.getName());System.out.println("類名稱 " + demo3.getName());}}


運行結果:

?

?

3.通過反射來創建(實例化)一個對象,使用的是無參構造方法。

?

package reflect.test3;import reflect.person.Person;/*** @author Administrator 通過Class實例化其他類的對象* * 通過無參構造實例化對象*/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");//獲得了特定名稱的類的class對象} catch (ClassNotFoundException e) {e.printStackTrace();}Person person = null;try {person = (Person) demo.newInstance();//使用class對象的newInstance()方法就可以創建一個對象了。/*** * * */} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}person.setName("ri");person.setAge(1);System.out.println(person);} }


4.通過有參的構造方法來構造對象

?

?

package reflect.test4;import java.lang.reflect.Constructor;import reflect.person.Person;/*** @author Administrator** 通過Class調用其他類中的構造函數 (也可以通過這種方式通過Class創建其他類的對象)*/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Person per1 = null;Person per2 = null;Person per3 = null;Person per4 = null;Constructor<?> cons[] = demo.getConstructors();try {per4 = (Person) cons[0].newInstance();per3 = (Person) cons[1].newInstance("ri", 12);per1 = (Person) cons[2].newInstance("dd");per2 = (Person) cons[3].newInstance(12);} catch (Exception e) {e.printStackTrace();}System.out.println(per1);System.out.println(per2);System.out.println(per3);System.out.println(per4);} }

?

?

5.通過反射來獲得一個類所實現的接口

?

package reflect.test5;/*** @author Administrator 返回一個類實現的接口*/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {e.printStackTrace();}// 獲得所有的接口Class<?> intes[] = demo.getInterfaces();for (int i = 0; i < intes.length; i++) {System.out.println("Person1實現的接口:" + intes[i].getName());}} }


運行結果:

?


?

6.通過反射來獲得指定類的父類

?

package reflect.test6;/*** @author Administrator 取得其他類中的父類*/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Class<?> superClass = demo.getSuperclass();System.out.println("繼承的父類為" + superClass.getName());} }


運行結果:

?

?

7.通過反射來獲得指定類中的構造方法

?

package reflect.test7;import java.lang.reflect.Constructor;/*** @author Administrator獲得其他類中的全部構造函數**/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person1.Person1");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}Constructor<?> cons[] = demo.getConstructors();for (Constructor<?> con : cons) {System.out.println(con);}} }


8.通過拼裝的方式來獲得構造方法(本質是獲得構造方法的各種信息,我們也可以用在類的各種方法上)

?

?

package reflect.test8;import java.lang.reflect.Constructor; import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator 拼裝獲得構造方法的全部內容*/ public class Hello extends HelloOriginal {public static void main(String[] args) {Constructor<?>[] cons = getDemo().getConstructors();for (Constructor<?> con : cons) {Class<?>[] pts = con.getParameterTypes();System.out.print("構造方法: ");int mo = con.getModifiers();System.out.print(Modifier.toString(mo) + " ");System.out.print(con.getName());System.out.print("(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + " arg" + i);if (i < pts.length - 1) {System.out.print(",");}}System.out.println("){}");}} }

?

?

9.拼裝類中的所有方法的簽名

?

package reflect.test9;import java.lang.reflect.Method; import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator拼接獲得類中普通方法的所有內容(方法簽名)**/ public class Hello9 extends HelloOriginal {public static void main(String[] args) {/*獲得類中的所有方法*/Method[] methods = getDemo().getMethods();for (Method method : methods) {Class<?> returnType = method.getReturnType();/*獲得方法的返回類型的class實例*/Class<?>[] pts = method.getParameterTypes();/*獲得方法參數的class實例的數組*/int tem = method.getModifiers();/*獲得方法的修飾符*/System.out.print(Modifier.toString(tem) + " ");System.out.print(returnType.getName() + " ");System.out.print(method.getName() + "(");for (int i = 0; i < pts.length; i++) {System.out.print(pts[i].getName() + "arg" + i);if (i < pts.length - 1) {System.out.print(",");}}Class<?>[] execs = method.getExceptionTypes();/*獲得方法拋出的異常*/if (execs.length > 0) {System.out.print(") throws ");for (int j = 0; j < execs.length; j++) {System.out.print(execs[j].getName() + " ");if (j < execs.length - 1) {System.out.print(",");}}} else {System.out.print(")");}System.out.println("{}");}} }


10.通過反射獲得本類以及繼承的屬性

?

?

package reflect.test10;import java.lang.reflect.Field; import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator取得其他類的全部屬性吧**/ public class Hello extends HelloOriginal {public static void main(String[] args) {System.out.println("=================本類全部屬性=====================");Field[] fields = getDemo().getDeclaredFields();for (int i = 0; i < fields.length; i++) {// 權限修飾符int mo = fields[i].getModifiers();String priv = Modifier.toString(mo);// 屬性類型Class<?> type = fields[i].getType();System.out.println(priv + " " + type.getName() + " "+ fields[i].getName() + ";");}System.out.println("===============實現的接口或者父類的屬性========================");Field[] fields1 = getDemo().getFields();for (Field filed : fields1) {// 權限修飾符int mo = filed.getModifiers();String priv = Modifier.toString(mo);// 屬性類型Class<?> type = filed.getType();System.out.println(priv + " " + type.getName() + " "+ filed.getName() + ";");}} }

?


11.通過反射來調用其他類中的方法

?

?

?

package reflect.test11;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 通過反射調用其他類中的方法*/ public class Hello extends HelloOriginal {public static void main(String[] args) {try {Method method = getDemo().getMethod("sayChina");method.invoke(getDemo().newInstance());method = getDemo().getMethod("sayHello", String.class, int.class);method.invoke(getDemo().newInstance(), "34324", 33);} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }


12.通過反射調用其他類的get和set方法

?

?

package reflect.test12;import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 調用其他類的set和get方法*/ public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();setter(obj, "Sex", "男", String.class);getter(obj, "Sex");}public static void getter(Object obj, String att) throws Exception {Method method = obj.getClass().getMethod("get" + att);System.out.println(method.invoke(obj));}public static void setter(Object obj, String att, Object value,Class<?> type) throws Exception {Method method = obj.getClass().getMethod("set" + att, type);method.invoke(obj, value);} }


13.通過反射操作其他類的屬性

?

?

package reflect.test13;import java.lang.reflect.Field;import reflect.HelloOriginal; import reflect.person1.Person1;/*** @author Administrator 通過反射操作屬性*/ public class Hello extends HelloOriginal {public static void main(String[] args) throws Exception {Object obj = getDemo().newInstance();Field field = getDemo().getDeclaredField("sex");field.setAccessible(true);field.set(obj, "女");System.out.println(((Person1) obj).getSex());} }

14.通過反射獲取并修改數組的信息

?

?

package reflect.test14;import java.lang.reflect.Array;import reflect.HelloOriginal;/*** @author Administrator 通過反射獲取并修改數組的信息*/ public class Hello extends HelloOriginal {public static void main(String[] args) {int[] tem = { 1, 2, 3, 4, 5 };Class<?> test = tem.getClass().getComponentType();System.out.println("數組類型" + test.getName());System.out.println("數組長度 " + Array.getLength(tem));System.out.println("數組的第一個元素: " + Array.get(tem, 0));Array.set(tem, 0, 100);System.out.println("修改之后數組第一個元素為: " + Array.get(tem, 0));} }


15.通過反射修改數組的大小

?

?

package reflect.test15;import java.lang.reflect.Array;/*** @author Administrator 通過反射修改數組大小*/ public class Hello {public static void main(String[] args) {int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int[] newTmep = (int[]) arrayInc(temp, 15);print(newTmep);String[] atr = { "a", "b", "c" };String[] str1 = (String[]) arrayInc(atr, 8);print(str1);}public static Object arrayInc(Object obj, int len) {Class<?> tem = obj.getClass().getComponentType();Object newArr = Array.newInstance(tem, len);int co = Array.getLength(obj);System.arraycopy(obj, 0, newArr, 0, co);return newArr;}public static void print(Object obj) {Class<?> clazz = obj.getClass();if (!clazz.isArray()) {return;}System.out.println("數組長度為----" + Array.getLength(obj));for (int i = 0; i < Array.getLength(obj); i++) {System.out.println(Array.get(obj, i));}} }


16.通過反射獲得類加載器

?

?

package reflect.test16;import reflect.person.Person;/*** @author Administrator 獲得類加載器*/ public class Hello {public static void main(String[] args) {Person person = new Person();System.out.println(person.getClass().getClassLoader().getClass());} }

?

?

17.使用java的代理

?

package reflect.subject;public interface Subject {public String say(String name, int age); }

?

package reflect.subject;public class RealSubject implements Subject {@Overridepublic String say(String name, int age) {return name + " " + age;}}

?

?

?

package reflect.subject;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler {private Object obj = null;public Object bind(Object obj) {this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println(proxy.getClass());return method.invoke(this.obj, args);}}

?

?

?

package reflect.test17;import reflect.subject.MyInvocationHandler; import reflect.subject.RealSubject; import reflect.subject.Subject;/*** @author Administrator 動態代理測試*/ public class Hello {public static void main(String[] args) {MyInvocationHandler demo = new MyInvocationHandler();Subject sub = (Subject) demo.bind(new RealSubject());String info = sub.say("xxxxx", 20);System.out.println(info);} }

?

?

?

總結

以上是生活随笔為你收集整理的java反射的使用概览的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。