java反射的使用概览
額,研究過這個(gè)的人很多很多,但是我沒有很深入的研究過,所以誰也攔不住我去研究研究,然后記錄下來······如有雷同··那就雷同了···請(qǐng)多多包涵。
?
首先是整個(gè)項(xiàng)目的結(jié)構(gòu):
?
?
使用到的類:
?
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 通過一個(gè)對(duì)象獲得完整的包名和類名*/ public class Hello {public static void main(String[] args) {Demo demo = new Demo();System.out.println(demo.getClass().getName());} }?
?
?
這是反射的最最基礎(chǔ)的東西了吧,我新建了一個(gè)對(duì)象,并且通過這個(gè)對(duì)象來獲得它的class,有了class以后,我就可以操作class的相關(guān)信息了,這里我打印出了這個(gè)class的name屬性。
這里就很容易的理解了反射,反射反射就是反過來搞。我們總是通過類來創(chuàng)建對(duì)象,而現(xiàn)在我們通過一個(gè)特定的對(duì)象(有時(shí)候我們不知道這個(gè)對(duì)象所屬什么類)獲得了它所歸屬的類的相關(guān)信息。
運(yùn)行結(jié)果:
?
2.創(chuàng)建class對(duì)象的三種方式
?
package reflect.test2;import reflect.demo.Demo;/*** @author Administrator 實(shí)例化Class類對(duì)象**/ public class Hello {public static void main(String[] args) {Class<?> demo1 = null;// Class<?>是一種泛型的表達(dá),意思是Object類及其子類都可以放Class<?> demo2 = null;Class<?> demo3 = null;try {// 一般使用的方式,通過指定特定的名稱來創(chuàng)建classdemo1 = Class.forName("reflect.demo.Demo");} catch (Exception e) {e.printStackTrace();}demo2 = new Demo().getClass();//通過一個(gè)對(duì)象來獲得classdemo3 = Demo.class;//通過類來獲得classSystem.out.println("類名稱 " + demo1.getName());System.out.println("類名稱 " + demo2.getName());System.out.println("類名稱 " + demo3.getName());}}
運(yùn)行結(jié)果:
?
?
3.通過反射來創(chuàng)建(實(shí)例化)一個(gè)對(duì)象,使用的是無參構(gòu)造方法。
?
package reflect.test3;import reflect.person.Person;/*** @author Administrator 通過Class實(shí)例化其他類的對(duì)象* * 通過無參構(gòu)造實(shí)例化對(duì)象*/ public class Hello {public static void main(String[] args) {Class<?> demo = null;try {demo = Class.forName("reflect.person.Person");//獲得了特定名稱的類的class對(duì)象} catch (ClassNotFoundException e) {e.printStackTrace();}Person person = null;try {person = (Person) demo.newInstance();//使用class對(duì)象的newInstance()方法就可以創(chuàng)建一個(gè)對(duì)象了。/*** * * */} 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.通過有參的構(gòu)造方法來構(gòu)造對(duì)象
?
?
package reflect.test4;import java.lang.reflect.Constructor;import reflect.person.Person;/*** @author Administrator** 通過Class調(diào)用其他類中的構(gòu)造函數(shù) (也可以通過這種方式通過Class創(chuàng)建其他類的對(duì)象)*/ 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.通過反射來獲得一個(gè)類所實(shí)現(xiàn)的接口
?
package reflect.test5;/*** @author Administrator 返回一個(gè)類實(shí)現(xiàn)的接口*/ 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實(shí)現(xiàn)的接口:" + intes[i].getName());}} }
運(yùn)行結(jié)果:
?
?
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());} }
運(yùn)行結(jié)果:
?
?
7.通過反射來獲得指定類中的構(gòu)造方法
?
package reflect.test7;import java.lang.reflect.Constructor;/*** @author Administrator獲得其他類中的全部構(gòu)造函數(shù)**/ 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.通過拼裝的方式來獲得構(gòu)造方法(本質(zhì)是獲得構(gòu)造方法的各種信息,我們也可以用在類的各種方法上)
?
?
package reflect.test8;import java.lang.reflect.Constructor; import java.lang.reflect.Modifier;import reflect.HelloOriginal;/*** @author Administrator 拼裝獲得構(gòu)造方法的全部內(nèi)容*/ 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("構(gòu)造方法: ");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拼接獲得類中普通方法的所有內(nèi)容(方法簽名)**/ public class Hello9 extends HelloOriginal {public static void main(String[] args) {/*獲得類中的所有方法*/Method[] methods = getDemo().getMethods();for (Method method : methods) {Class<?> returnType = method.getReturnType();/*獲得方法的返回類型的class實(shí)例*/Class<?>[] pts = method.getParameterTypes();/*獲得方法參數(shù)的class實(shí)例的數(shù)組*/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++) {// 權(quán)限修飾符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("===============實(shí)現(xiàn)的接口或者父類的屬性========================");Field[] fields1 = getDemo().getFields();for (Field filed : fields1) {// 權(quán)限修飾符int mo = filed.getModifiers();String priv = Modifier.toString(mo);// 屬性類型Class<?> type = filed.getType();System.out.println(priv + " " + type.getName() + " "+ filed.getName() + ";");}} }?
11.通過反射來調(diào)用其他類中的方法
?
?
?
package reflect.test11;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 通過反射調(diào)用其他類中的方法*/ 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.通過反射調(diào)用其他類的get和set方法
?
?
package reflect.test12;import java.lang.reflect.Method;import reflect.HelloOriginal;/*** @author Administrator 調(diào)用其他類的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.通過反射獲取并修改數(shù)組的信息
?
?
package reflect.test14;import java.lang.reflect.Array;import reflect.HelloOriginal;/*** @author Administrator 通過反射獲取并修改數(shù)組的信息*/ 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("數(shù)組類型" + test.getName());System.out.println("數(shù)組長度 " + Array.getLength(tem));System.out.println("數(shù)組的第一個(gè)元素: " + Array.get(tem, 0));Array.set(tem, 0, 100);System.out.println("修改之后數(shù)組第一個(gè)元素為: " + Array.get(tem, 0));} }
15.通過反射修改數(shù)組的大小
?
?
package reflect.test15;import java.lang.reflect.Array;/*** @author Administrator 通過反射修改數(shù)組大小*/ 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("數(shù)組長度為----" + 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 動(dòng)態(tài)代理測(cè)試*/ 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);} }?
?
?
總結(jié)
以上是生活随笔為你收集整理的java反射的使用概览的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器群集:Windows 2000 和
- 下一篇: 攻克学习多线程时碰到的难题(zz)