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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!

發布時間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

就比如我前幾天被面試官問什么是反射???

而我的回答是!!!

反射是動態語言的關鍵,反射允許程序在執行期間借助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);//null

Extension 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

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的涨薪关键之反射机制,引得项目经理对你的看重,加薪触手可及!!!!的全部內容,希望文章能夠幫你解決所遇到的問題。

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