這篇文章主要為大家展示了“Java反射機制的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Java反射機制的示例分析”這篇文章吧。
Java反射機制
一、什么是反射機制
簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,
那么就可以通過反射機制來獲得類的所有信息。
二、哪里用到反射機制
有些時候,我們用過一些知識,但是并不知道它的專業術語是什么,在剛剛學jdbc時用過一行代碼,
Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那時候只知道那行代碼是生成
驅動對象實例,并不知道它的具體含義。聽了反射機制這節課后,才知道,原來這就是反射,現在很多開
框架都用到反射機制,hibernate、struts都是用反射機制實現的。
三、反射機制的優點與缺點
為什么要用反射機制?直接創建對象不就可以了嗎,這就涉及到了動態與靜態的概念,
靜態編譯:在編譯時確定類型,綁定對象,即通過。
動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多
態的應用,有以降低類之間的藕合性。
一句話,反射機制的優點就是可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中它的靈活性就表現的十分明顯。比如,一個大型的軟件,不可能一次就把把它設計的很完美,當這個程序編譯后,發布了,當發現需要更新某些功能時,我們不可能要用戶把以前的卸載,再重新安裝新的版本,假如這樣的話,這個軟件肯定是沒有多少人用的。采用靜態的話,需要把整個程序重新編譯一次才可以實現功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。
它的缺點是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它
滿足我們的要求。這類操作總是慢于只直接執行相同的操作。
列舉java語言中反射的常用方法
package review;/*12:43 2019/7/21*/
import model.AnotherClass;
import model.OneClassMore;
import model.SomeClass;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 這個類列舉了java語言中關于反射機制的常用的一些方法
* @author zhangxingshuo
*/
public class AboutReflection {
public static void main(String[] args) throws Exception {
}
/*獲得Class對象的3種方式*/
private static Class<?> getClazz0(String className) throws ClassNotFoundException {
Class clazz=Class.forName(className);
return clazz;
}
private static Class<?> getClazz1(Object object) {
Class clazz=object.getClass();
return clazz;
}
private static Class<?> getClazz2() {
Class clazz=model.SomeClass.class;
return clazz;
}
/*經常使用的Class對象的3個方法*/
private static String useClazz0(Class clazz) {
String fullyQualifiedName=clazz.getName();
return fullyQualifiedName;
}
private static String useClazz1(Class clazz) {
String className=clazz.getSimpleName();
return className;
} //ex:private //ex:abstract
private static Object useClazz2(Class clazz) throws IllegalAccessException, InstantiationException {
Object object=clazz.newInstance();
return object;
}
/*獲得Constructor對象的3個方法*/
private static Constructor<?>[] getConstructorObject0(Class clazz) {
Constructor<?>[] constructors=clazz.getConstructors();
return constructors;
}
private static Constructor<?>[] getConstructorObject1(Class clazz) {
Constructor<?>[] constructors=clazz.getDeclaredConstructors();
return constructors;
}
private static Constructor<?> getConstructorObject2(Class clazz) throws NoSuchMethodException {
Constructor<?> constructor=clazz.getConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class);
return constructor;
}
private static Constructor<?> getConstructorObject3(Class clazz) throws NoSuchMethodException {
Constructor<?> constructor=clazz.getDeclaredConstructor(SomeClass.class, AnotherClass.class, OneClassMore.class);
return constructor;
}
/*經常使用的Constructor對象的2個方法*/
private static Object useConstructorObject0(Constructor<?> constructor) throws IllegalAccessException, InvocationTargetException, InstantiationException {
//under here,if the variable override==true,jvm willl not check the accessible modifier
Object object=constructor.newInstance(new SomeClass(),new AnotherClass(),new OneClassMore());
return object;
}
private static void useConstructorObject1(Constructor<?> constructor) {
//under here changing "override" variable's value who is defined in AccessibleObject,the "super and super" Class of Constructor
constructor.setAccessible(true);
}
/*還有一些*/
private static Class<?> useConstructorObject2(Constructor<?> constructor) {
Class clazz=constructor.getDeclaringClass();
return clazz;
}
private static int useConstructorObject3(Constructor<?> constructor) {
int modifiers=constructor.getModifiers();
return modifiers;
}
private static String useConstructorObject4(Constructor<?> constructor) {
//constructor name is same as the class name
String constructorName = constructor.getName();
//under here getDeclaringClass().getName();
return constructorName;
}
/*獲取Field對象的4個方法*/
private static Field[] getFieldObject0(Class clazz){
Field[] fields = clazz.getFields();
return fields;
}
private static Field[] getFieldObject1(Class clazz){
Field[] declaredFields = clazz.getDeclaredFields();
return declaredFields;
}
private static Field getFieldObject2(Class clazz) throws NoSuchFieldException {
Field field = clazz.getField("theFieldName");
return field;
}
private static Field getField3(Class clazz) throws NoSuchFieldException {
Field field = clazz.getDeclaredField("theFieldName");
return field;
}
/*經常使用的Field對象的3個方法*/
private static Object useFieldObject0(Field field,Object object) throws IllegalAccessException {
Object fieldValue = field.get(object);
return fieldValue;
}
private static void useFieldObject1(Field field,Object object) throws IllegalAccessException {
//an object as the field value
field.set(object,new Object());
}
private static void useFieldObject2(Field field){
//same process
field.setAccessible(true);
}
/*還有一些*/
private static int useFieldObject3(Field field){
int modifiers = field.getModifiers();
return modifiers;
}
private static String useFieldObject4(Field field){
String fieldName = field.getName();
return fieldName;
}
/*獲取Method對象的4個方法*/
private static Method[] getMethodObject0(Class clazz){
Method[] methods=clazz.getMethods();
return methods;
}
private static Method[] getMethodObject1(Class clazz){
Method[] methods=clazz.getDeclaredMethods();
return methods;
}
private static Method getMethodObject2(Class clazz) throws NoSuchMethodException {
Method method=clazz.getMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class);
return method;
}
private static Method getMethodObject3(Class clazz) throws NoSuchMethodException {
Method method=clazz.getDeclaredMethod("someMethodName",SomeClass.class,AnotherClass.class,OneClassMore.class);
return method;
}
/*經常使用的Field對象的2個方法*/
private static Object useMethodObject0(Method method,Object object) throws InvocationTargetException, IllegalAccessException {
Object returnedobject=method.invoke(object,new SomeClass(),new AnotherClass(),new OneClassMore());
return returnedobject;
}
private static void useMethodObject1(Method method){
method.setAccessible(true);
}
/*還有一些*/
private static int useMethodObject2(Method method){
int modifiers = method.getModifiers();
return modifiers;
}
private static String useMethodObject3(Method method){
String methodName = method.getName();
return methodName;
}
/*
tips
通過getMethods(),得到該類或接口獨有的和繼承自它的所有父類與接口的public方法組成的數組.
通過getDeclaredMethods(),得到該類或接口獨有的所有方法,(包括public和非public).
*/
/*just as a empty template for convenience*/
private static void m(){
}
}以上是“Java反射機制的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。