涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!
前言
就比如我前幾天被面試官問什么是反射???
而我的回答是!!!
反射是動態語言的關鍵,反射允許程序在執行期間借助Reflection API取得任何類的內部信息,并能直接操作任曦對象的內部屬性及方法。
1.Java反射提供的功能
- 在運行時判斷任意一個對象所屬的類
- 在運行時構造任意一個類的對象
- 在運行時判斷任意一個類具有的成員變量和方法
- 在運行時調用任意一個對象的成員變量和方法
2.放射常用的API
- java.lang.Class : 代表一個類
- java.lang.reflect.Method:代表類的方法
- java.lang.reflect.Field:代表類的成員變量
- java .lang.reflect.Construct:代表類的構造方法
3.java.lang.Class
我們創建一個類,通過編譯(Javac.exe),生成對應的.class文件。之后我們使用java.exe加載(JVM類加載器)此.class文件。此.class文件加載到內存以后,就是一個運行時類。存放在緩沖區,Class允許通過一個實例化對象找到一個類的完成信息資料。
Class類的作用:
- 1.每一個運行時類只加載一次!
- 2.獲取對應的運行時類的完整結構(屬性,方法,構造器,內部類,父類,所在包,異常,注 解。。。。) ?
- 3.調用對應的運行時類的指定結構(屬性,方法,構造器)
- 4.反射應用:動態代理
4.獲取Class對象。
1.調用運行時類本身的.class屬性
Class<Person> personClass01 = Person.class;2.通過運行時類的一個對象
Person person = new Person(); Class<? extends Person> aClass = person.getClass();3.通過Class.forName("com.jdy.bean.Dog")
Class<?> aClass1 = Class.forName("com.jdy.bean.Dog");4.通過類的加載器
ClassLoader classLoader = this.getClass().getClassLoader();5.Class類的常用方法
public Constructor<?>[] getConstructors() throws SecurityException //獲取類的全部構造 public Field[] getDeclaredFields() throws SecurityException//獲取類中全部的屬性 public Field[] getFields() throws SecurityException //獲取繼承的全部屬性 public Method[] getMethods() throws SecurityException//獲取一個類中的所有方法 public Class<?>[] getInterfaces() //獲取類實現的所有接口 public native Class<? super T> getSuperclass();//獲取類的父類 //加入Java開發交流君樣:593142328一起吹水聊天6.Class應用
(1)通過無參構造實例化對象
String packageName ="com.jdy.bean.Dog"; Class<?> aClass = Class.forName(packageName); Dog dog = (Dog)aClass.newInstance(); //使用newInstance()必須保證實例化類中存在一個無參構造器(2)調用有參構造器實例化對象
public int getModifiers()//獲取構造方法的修飾符 public String getName()//獲取構造方法的名稱 public Class<?>[] getParameterTypes()//獲取構造方法的參數類型 public T newInstance(Object ... initargs)//像構造方法,傳入參數實例化對象 <Dog> constructor = (Constructor<Dog>) aClass.getConstructor(String.class, String.class, String.class); Dog dog1 = constructor.newInstance("二狗子", "黑背", "8");(3)獲取類結構
- Constructor:表示類的構造器
- Field:表示類的屬性
- Method:表示類的方法
取得所有實現的接口
[] interfaces = aClass.getInterfaces();取得父類
Class<?> superclass = aClass.getSuperclass();取得全部構造器
Constructor<?>[] constructors = aClass.getConstructors();將訪問修飾符由數字轉化成可看懂的
int modifiers = declaredField.getModifiers(); System.out.println("modifiers = " + Modifier.toString(modifiers));取得所有的方法
Method[] methods = aClass.getMethods();取得全部屬性
//得到實現的接口或父類中的公共屬性 Field[] fields = aClass.getFields(); //得到本類當中的全部屬性 Field[] declaredFields = aClass.getDeclaredFields();Field的常用方法
//得到一個對象中屬性的具體內容 public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException //設置指定對象中屬性的具體內容 public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException//得到屬性的修飾符 public int getModifiers() //返回屬性的名稱 public String getName() //判斷屬性是否可悲外部訪問 public boolean isAccessible() //設置一個屬性是否可被外部方法 public void setAccessible(boolean flag) throws SecurityException //加入Java開發交流君樣:593142328一起吹水聊天(4)通過反射待用類中的方法
Method destory_method = aClass.getMethod("destory_method"); //invoke方法的參數是一個實例化的對象 Object invoke = destory_method.invoke(aClass.newInstance());(5)通過方法操作屬性
反射中通過Field類提供的set()/get()完成設置和取得屬性內容的操作,但是類中的屬性都設置成私有的訪問權限,所以在使用set()/get()方法時首先要使用Field()中的setAccessible(true),方法將需要操作的屬性設置成可被外部訪問。
Field field0 = personClass.getDeclaredField("address"); //todo 什么校驗 field0.setAccessible(true); field0.set(person,"xian"); System.out.println(person);一般給類的屬性賦值,不建議使用以上方法,因為擴大了屬性的訪問權限,建議使用類中屬性的getter/setter方法
5.ClassLoader:類的加載器 類的加載器是用來把類(class)裝載進內存的,JVM規范定義了兩種類型的類加載器: 啟動類加載器(bootstrap) 用戶類加載器(user-defind class loader) JVM 在運行時會產生3個類加載器組成的初始化加載器層次結構
Bootstrap ClassLoader:引導類加載器:用C++編寫,時jVM自帶的類加載器,負責JAVA平臺核心類庫的加載。該加載器無法直接獲取資料
>//3.引導類加載器不能直接獲取 ClassLoader parent1 = parent.getParent(); System.out.println("引導類加載器 = " + parent1);//nullExtension ClassLoader:負責jre/lib/ext目錄下的jar包或者 -D java.ext.dirs指定目錄下的jar包裝入工作庫
//2.獲取擴展類加載器 ClassLoader parent = loader.getParent(); System.out.println("擴展類加載器 = " + parent);System ClassLoader:系統類加載器,負責java -classpath或者 -D java.class.path所知的目錄下的類與jar包裝入工作,是最常用的加載器
//1.獲取系統類加載器 ClassLoader loader = ClassLoader.getSystemClassLoader(); System.out.println("系統類加載器 = " + loader);獲取某個實例的類加載器
Person person = new Person(); Class<? extends Person> aClass = person.getClass(); ClassLoader classLoader = aClass.getClassLoader(); System.out.println("Perosn類的加載器 = " +classLoader); aClass1 = Class.forName("com.jdy.bean.Dog"); ClassLoader classLoader1 = aClass1.getClassLoader(); System.out.println("Dog類的加載器 = " + classLoader1);類加載器配合IO
ClassLoader classLoader2 = this.getClass().getClassLoader(); InputStream resourceAsStream = classLoader2.getResourceAsStream("test.properties"); Properties properties = new Properties(); properties.load(resourceAsStream);最后,祝大家早日學有所成,拿到滿意offer
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。