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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

反射的原理

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

1.什么是反射?? 框架設計的靈魂

框架:就是一個半成品, 好處:提高我們的開發效率,使我們的代碼更加簡潔

反射:? 運行時把類中的成員抽取出來為其他類的過程叫做反射

2.java代碼從編譯到運行經歷了幾個階段

經歷了3個階段,

?3.如何獲得反射類Class.

①.? Class.forName("類的位置")

②.? 通過類名來獲取? ;類.class

③.? 對象

public class Test1 {public static void main(String[] args) throws Exception{//獲取Class類的方式//1.通過全類名字符串來獲取Class<?> aClass = Class.forName("com.wpl.demo1.student");//2.通過類名來獲取Class<student> aClass1 = student.class;//3.對象student s = new student();Class<? extends student> aClass2 = s.getClass();System.out.println(aClass==aClass1);System.out.println(aClass==aClass2);System.out.println(aClass1==aClass2);//總結: 無論用什么樣的方式得到反射類 反射類對象只有一個} } class T extends student{private String sex;} class student{private String name;private int age;public student() {}public void show(){System.out.println("無參方法");}public void sun(String name,int age){System.out.println(name+"是有參方法"+age);}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';} }

4.如何通過反射類獲取對應的反射類對象

public class Test2 {public static void main(String[] args) throws Exception{//獲取反射類Class<student> aClass =student.class;//獲取反射類對象student s= aClass.newInstance();System.out.println(s);}} class T extends com.wpl.demo2.student {private String sex;} class student{private String name;private int age;public student() {}public void show(){System.out.println("無參方法");}public void sun(String name,int age){System.out.println(name+"是有參方法"+age);}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';} }

5.獲取Field類的方式

getDeclaredField(String name) :獲取本類中指定屬性名的Field對象。
getDeclaredFields() :獲取本類中所有的屬性對象

getField(String name) :獲取指定public修飾的屬性名的Field對象。【包含父類的屬性】
getFields() :獲取所有public修飾的屬性對象【包含父類的屬性】

public class Test2 {public static void main(String[] args) throws Exception{//獲取反射類Class<student> aClass =student.class;//獲取反射類對象Object o= aClass.newInstance();/*** 獲取Field類的方式** Field類 在java虛擬機中抽取類的屬性 放入Field類中** getDeclaredField(String name) :獲取本類中指定屬性名的Field對象。* getDeclaredFields() :獲取本類中所有的屬性對象** getField(String name) :獲取指定public修飾的屬性名的Field對象。【包含父類的屬性】* getFields() :獲取所有public修飾的屬性對象【包含父類的屬性】*///獲取本類中指定屬性名的Field對象/* Field name = aClass.getDeclaredField("name");System.out.println(name);*//* Field[] fields = aClass.getDeclaredFields();System.out.println(fields);*//* Field sex = aClass.getField("sex");System.out.println(sex);*//* Field[] fields = aClass.getFields();System.out.println(fields);*/Field name = aClass.getDeclaredField("name");name.setAccessible(true);// 設置私有屬性的可見性,打破面向對象的封裝性 不推薦使用name.set(o,"張三");System.out.println(o);} } class T {public String sex;} class student extends T{private String name;public int age;public student() {}public void show(){System.out.println("無參方法");}public void sun(String name,int age){System.out.println(name+"是有參方法"+age);}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';} }

6.如何獲取方法類Method

?getDeclaredMethod(String name, Class<?>... parameterTypes) :獲取本類中指定方法名的方法對象。

getDeclaredMethods() :獲取本類中所有的方法。

getMethod(String name, Class<?>... parameterTypes) :獲取指定類中public修飾的方法 包含父類 getMethods() 獲取所有的public方法

public class Test3 {public static void main(String[] args) throws Exception{Class<student> aClass = student.class;student o = aClass.newInstance();/*** 如何獲取Method類** getDeclaredMethod(String name, Class<?>... parameterTypes) :獲取本類中指定方法名的方法對象。* getDeclaredMethods() :獲取本類中所有的方法。* getMethod(String name, Class<?>... parameterTypes) :獲取指定類中public修飾的方法 包含父類* getMethods() 獲取所有的public方法*/Method show = aClass.getDeclaredMethod("show");// 回調方法 方法名 . invoke() 括號中填寫 反射類對象show.invoke(o);/* Method[] declaredMethods = aClass.getDeclaredMethods();System.out.println(declaredMethods);*/Method sub = aClass.getDeclaredMethod("sub");// 設置私有方法的可以見 打破了面向對象的封裝性 不推薦使用sub.setAccessible(true);sub.invoke(o);// 獲得指定public修飾的方法 包含父類Method sun = aClass.getMethod("sun", String.class, int.class);Object invoke = sun.invoke(o, "瑤瑤", 12);} } class T {public String sex;} class student extends T {private String name;public int age;public student() {}public void show(){System.out.println("無參方法");}public void sun(String name,int age){System.out.println(name+"是有參方法"+age);}private void sub(){System.out.println("私有的無參構造");}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';} }

7.如何獲取構造類Constructor

getConstructor(類<?>... parameterTypes)
getConstructors()
該類Constructor中具有的方法:如果類中沒有無參構造函數時。
newInstance

public class Test4 {public static void main(String[] args) throws Exception{//獲取反射類Class<student> aClass = student.class;//獲取反射類對象student s = aClass.newInstance();/*** getConstructor(類<?>... parameterTypes)* getConstructors()* 該類Constructor中具有的方法:如果類中沒有無參構造函數時。* newInstance*/Constructor<student> constructor = aClass.getConstructor();System.out.println(constructor);//當獲取有參構造時 把參數的數據類型.class 填寫在括號中Constructor<student> constructor1 = aClass.getConstructor(String.class);// 用 newInstance方法 把屬性值填寫進去student newInstance = constructor1.newInstance("張三");System.out.println(newInstance);} } class T {public String sex;} class student extends T {private String name;public int age;public student() {}public student(String name) {this.name = name;}public void show(){System.out.println("無參方法");}public void sun(String name,int age){System.out.println(name+"是有參方法"+age);}private void sub(){System.out.println("私有的無參構造");}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +'}';} }

8. 獲取注解類對象Annotation

public class Test5 {public static void main(String[] args)throws Exception {System.out.println("獲取類上注解的對象");Class<Doctor> aClass = Doctor.class;Service service = aClass.getAnnotation(Service.class);System.out.println(service);System.out.println(service.value());System.out.println("獲取屬性上的注解對象");Field name = aClass.getDeclaredField("name");JsonProperty annotation = name.getAnnotation(JsonProperty.class);System.out.println(annotation);System.out.println(annotation.value());System.out.println("獲取方法上的注解對象");Method method = aClass.getMethod("hello");RequestMapping annotation1 = method.getAnnotation(RequestMapping.class);System.out.println(annotation1);System.out.println(annotation1.value());} }@Service(value = "wpl") class Doctor{@JsonProperty(value = "wpl",required = true)//value required都是注解的屬性private String name;@RequestMapping(value = {"hello2","hahaha","hehe"})public void hello(){System.out.println("hello");} }

總結

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

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