反射的原理
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修飾的屬性對象【包含父類的屬性】
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
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");} }總結
- 上一篇: 数字电路-【百科总结】
- 下一篇: 对C语言中与运算符与或运算符||的探讨