這篇文章主要介紹了Java 反射機制詳解及實例的相關資料,需要的朋友可以參考下
Java 反射機制詳解及實例
反射,當時常聽他們說,自己也看過一些資料,也可能在設計模式中使用過,但是感覺對它沒有一個較深入的了解,這次重新學習了一下,感覺還行吧!
一,先看一下反射的概念:
並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語意。
反射是Java中一種強大的工具,能夠使我們很方便的創建靈活的程式碼,這些程式碼可以再運行時裝配,無需在組件之間進行原始程式碼連結。但是反射使用不當會成本很高!
則已看概念且具暈的,繼續往下看。
二,反射機制的作用:
1,反編譯:.class-->.Java>.Java
>.Java
>. 2,透過反射機制存取java物件的屬性
##建構方法
屬性
">
## 如此好像更容易理解一些,而我們必須在下觀看時具體看怎麼實現這些功能。
三,在這裡先看一下sun為我們提供了那些反射機制中的類別:
java.lang.Class; java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
很多反射這四個類別中
查詢。還是哪一句話要學著不斷的查詢
API,那才是我們最好的老師。
四,特定功能實現:
, 建立物件
:取得類別以後我們來創建它的對象,利用newInstance://第一种方式: Classc1 = Class.forName("Employee"); //第二种方式: //java中每个类型都有class 属性. Classc2 = Employee.class; //第三种方式: //java语言中任何一个java对象都有getClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)3,取得屬性:分成所有的屬性和指定的屬性: a,先看獲取所有的屬性的寫法:Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例 Objecto = c.newInstance(); //调用了Employee的无参数构造方法.b,以獲取特定的屬性,並搭配傳統的方法來學習: //获取整个类 Class c = Class.forName("java.lang.Integer"); //获取所有的属性? Field[] fs = c.getDeclaredFields(); //定义可变长的字符串,用来存储属性 StringBuffer sb = new StringBuffer(); //通过追加的方法,将每个属性拼接到此字符串中 //最外边的public定义 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); //里边的每一个属性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 sb.append(field.getName()+";\n");//属性的名字+回车 } sb.append("}"); System.out.println(sb);4,獲取方法,和建構方法,不再詳細描述,只來看關鍵字:
#方法關鍵字 ##意義
getDeclaredMethods()
取得所有的方法
getReturnType()
獲得方法的放回類型
##getParameterTypes () 取得方法的傳入參數型別 #getDeclaredMethod("方法名稱",參數型別.class ,……) 獲得特定的方法 ##建構方法關鍵字 #意思 #getDeclaredConstructors() 取得所有的建構方法 ##getDeclaredConstructor(參數類型.class,… )
取得特定的建構方法
################ ########### ## ################父類別和父介面#############意思########################## ##getSuperclass()############取得某類別的父類別###################getInterfaces()###### ######取得某一類別實作的介面###
这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。
五,反射加配置文件,使我们的程序更加灵活:
在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:
当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:
<configuration> lt;appSettings> <add key="" value=""/> lt;/appSettings> </configuration>
反射的写法:
assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);
这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。
当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!
综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它。
以上是Java反射機制的實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!