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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java反射-学习

發布時間:2024/9/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java反射-学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

使用Java反射機制可以在運行時期獲取Java類的信息,可獲取以下相關的內容:
Class對象
類名
修飾符
包信息
父類
實現的接口
構造器
方法
變量
注解

簡單的反射例子:

1、獲取class對象(前提):

Class<Test> testClass = Test.class; 或 Class<?> aClass = Class.forName("com.alibaba.fastjson.JSONObject");

2、獲取類名:

String name1 = testClass.getName(); System.out.println("類名:"+name1);

結果:

類名:com.example.demo.Test

3、修飾符

Class<Test> testClass = Test.class;//當前類的修飾符int modifiers = testClass.getModifiers();System.out.println(Modifier.isAbstract(modifiers));System.out.println(Modifier.isPublic(modifiers));System.out.println(Modifier.isPrivate(modifiers));//結果false true false

方法的修飾符

Class<Test> testClass = Test.class;Method method = testClass.getMethod("getName", new Class[]{});int modifiers1 = method.getModifiers();System.out.println(Modifier.isPrivate(modifiers1));System.out.println(Modifier.isPublic(modifiers1));//結果 false true

4、包信息

Class<Test> testClass = Test.class;Package aPackage = testClass.getPackage();System.out.println(aPackage);//結果package com.example.demo

5、父類

Class<Test> testClass = Test.class;Class<? super Test> superclass = testClass.getSuperclass();String name = superclass.getName();System.out.println(name);//結果java.lang.Object

6、實現的接口

Class<Test> testClass = Test.class;Class<?>[] interfaces = testClass.getInterfaces();for (Class<?> anInterface : interfaces) {System.out.println(anInterface.getName());}//test類沒有實現接口 ,interfaces為空數組

7、構造器(獲取public共有修飾符的構造方法)

Class<Test> testClass = Test.class;Constructor<?>[] constructors = testClass.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor.getName());} //結果com.example.demo.Test

  

  例子:

  

Class<Test> testClass = Test.class;Constructor<Test> constructor = testClass.getConstructor();Test test = constructor.newInstance();System.out.println(test.delete());//結果 delete

?

8、獲取變量和方法

package com.example.demo;import java.lang.reflect.Field; import java.lang.reflect.Method;public class Test {public static void main(String[] args) {//獲取屬性Field[] fields = Test.class.getDeclaredFields();for (Field field : fields) {System.out.println(field.getName());}System.out.println("屬性==================方法");Method[] methods = Test.class.getMethods();for (Method method : methods) {String name = method.getName();System.out.println(name);}}private String name;private String sex;public String delete() {return "delete";}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;} }

輸出結果:

name sex 前邊為屬性==================后邊為當前類的所有的方法方法(保存從父類那繼承來的方法) main getName delete setName getSex setSex wait wait wait equals toString hashCode getClass notify notifyAll

例子:

Class<Test> testClass = Test.class;//獲取的方法是沒有參數的,所以下邊這個第二個參數就可以設置為nullMethod getName = testClass.getMethod("getName", null);//set方法只有一個參數,下班這個方法的第二個參數就是string.classMethod setName = testClass.getMethod("setName", String.class);//假如一個方法有兩個參數,則需要如下設置第二個參數Method setSex = testClass.getMethod("setSex", new Class[]{String.class, String.class});

獲取一個方法的參數類型:

Class<Test> testClass = Test.class;Method method = testClass.getMethod("getName", null);Class<?>[] parameterTypes = method.getParameterTypes();for (Class<?> parameterType : parameterTypes) {System.out.println(parameterType.getName());}

后去一個方法的返回類型:

Class<Test> testClass = Test.class;Method method = testClass.getMethod("getName", null);Class<?> returnType = method.getReturnType();System.out.println(returnType.getName());//結果 getname方法的返回值的類型為string java.lang.String

通過method調用方法:如果執行的是靜態方法,的method.invoke方法的第一個參數可以設置為null,第二個參數為方法執行需要的實參

Test t = new Test();t.setName("aaaaa");Class<? extends Test> testClass = t.getClass();Method method = testClass.getMethod("getName",null);String invoke = (String)method.invoke(t,null);System.out.println(invoke);

****Method.setAcessible(true)這行代碼,通過調用setAccessible()方法會關閉指定類的Method實例的反射訪問檢查

?9、注解

Class<Test> testClass = Test.class;Annotation[] annotations = testClass.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}

?

總結

以上是生活随笔為你收集整理的java反射-学习的全部內容,希望文章能夠幫你解決所遇到的問題。

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