java反射比较两个model6_java反射机制
Java反射機制
簡介
Java反射機制是指在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。用一句話總結就是反射可以實現在運行時可以知道任意一個類的屬性和方法。
Class 對象
在java中類也是對象,是Class類的實例對象,這個對象稱為該類的類類型 對于普通的對象,我們一般都會這樣創建和表示:
Code code = new Code();
上面說了,所有的類都是Class的對象,那么該如何表示呢,是不是可不可以通過如下方式呢:
Class cl = new Class();
但是我們查看Class的源碼時,是這樣寫的:
private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
可以看到構造器是私有的,只有JVM可以創建Class的對象,因此不可以像普通類一樣new一個Class對象,雖然我們不能new一個Class對象,但是卻可以通過已有的類得到一個Class對象,共有三種方式:
Class objectClass = Object.class;//任何一個類都有一個隱含的靜態成員變量class,這種方式是通過獲取類的靜態成員變量class得到的
Class objectClass = object.getClass();//object是Object的一個對象,這種方式是通過一個類的對象的getClass()方法獲得的
Class objectClass = Class.forName("xxx.xxx.Object");//這種方法是Class類調用forName方法,通過一個類的全量限定名獲得,一般使用這種方式獲取
簡單的例子:
Class objectClass1 = User.class;
System.out.println(objectClass1.getName());
User user = new User();
Class objectClass2 = user.getClass();
System.out.println(objectClass2.getName());
Class objectClass3 = Class.forName("com.java.reflection.demo.User");
System.out.println(objectClass3.getName());
執行結果:
com.java.reflection.demo.User
com.java.reflection.demo.User
com.java.reflection.demo.User
類名、包名、父類
我們可以從Class對象中獲取兩個版本的類名:
Class object = Class.forName("com.java.reflection.demo.User");
object.getName() //全限定類名(包含包名) eg:com.java.reflection.demo.User
object.getSimpleName()//類的名字(不包含包名) eg:User
object.getPackage() //包名 eg:com.java.reflection.demo
object.getSuperClass()//父類 eg:java.lang.Object
修飾符
可以通過 Class 對象來訪問一個類的修飾符, 即public,private,static 等等的關鍵字,你可以使用如下方法來獲取類的修飾符:
Class object = Class.forName("com.java.reflection.demo.User");
int modifiers = aClass.getModifiers();
修飾符都被包裝成一個int類型的數字,這樣每個修飾符都是一個位標識(flag bit),這個位標識可以設置和清除修飾符的類型。 可以使用 java.lang.reflect.Modifier 類中的方法來檢查修飾符的類型:
Modifier.isAbstract(int modifiers)
Modifier.isFinal(int modifiers)
Modifier.isInterface(int modifiers)
Modifier.isNative(int modifiers)
Modifier.isPrivate(int modifiers)
Modifier.isProtected(int modifiers)
Modifier.isPublic(int modifiers)
Modifier.isStatic(int modifiers)
Modifier.isStrict(int modifiers)
Modifier.isSynchronized(int modifiers)
Modifier.isTransient(int modifiers)
Modifier.isVolatile(int modifiers)
方法、變量、實現接口、構造函數
可以通過 Class 對象獲取 Method 對象,類的成員變量,實現的接口、Constructor類的實例。
Method對象
Method[] methods = Class.forName(className).getMethods();//public方法
//Method[] methods = Class.forName(className).getDeclaredMethods();//private方法
//指定的方法
Method method = cl.getMethod("method");//public
//Method method = cl.getDeclaredMethod("method")//private
成員變量
Field[] fields = Class.forName(className).getFields();//public修飾的成員變量
//Field[] fields = Class.forName(className).getDeclaredFields();//private修飾的成員變量
//指定的成員變量 Field field = Class.forName(className).getDeclaredField("name");
實現的接口
Class[] interfaces = Class.forName(className).getInterfaces();
Constructor類的實例
Constructor[] constructors = Class.forName(className).getConstructors();
//指定的Constructor類的實例
Constructor userConstructor = (Constructor) Class.forName(className).getConstructor(String.class,Integer.class,String.class);
演示demo下載
總結
到此,Java反射機制入門的差不多了,我是復習SpringMVC AOP里面自定義異常處理的時候,里面我們通過Java反射來實現的,希望這篇筆記也對你有用。
參考資料
總結
以上是生活随笔為你收集整理的java反射比较两个model6_java反射机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优秀的java代码_像这样写,Java菜
- 下一篇: java+arrayblockquene