一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 關于Java反射機制 你需要知道的事情

關于Java反射機制 你需要知道的事情

2021-01-07 11:40方志朋 Java教程

這篇文章主要介紹了Java反射機制的相關內容,涉及了class類的動態加載,獲取成員變量、構造函數信息等信息,需要的朋友可以參考下。

大家都知道,要讓Java程序能夠運行,那么就得讓Java類要被Java虛擬機加載。Java類如果不被Java虛擬機加載,是不能正常運行的。現在我們運行的所有的程序都是在編譯期的時候就已經知道了你所需要的那個類的已經被加載了。

Java的反射機制是在編譯并不確定是哪個類被加載了,而是在程序運行的時候才加載、探知、自審。使用在編譯期并不知道的類。這樣的特點就是反射。

反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

本篇將從以下幾個方面講述反射的知識:

calss的使用 方法的反射 構造函數的反射 成員變量的反射

一、什么是class類

在面向對象的世界里,萬物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只有java虛擬機才能new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class User{
}
public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");
 
//可以通過類的類型創建該類的實例對象
User user=(User)c1.newInstance();
}

二、class類的動態加載

Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動態加載類。編譯時刻加載類是靜態加載、運行時刻加載類是動態加載類。

三、獲取方法信息

基本的數據類型,void關鍵字都Class 類的實例;可以通過get
ame();getSimpleName()獲取類的名稱。

?
1
2
3
4
5
Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

獲取類的所有方法,并打印出來:

?
1
2
3
4
5
6
7
8
9
10
11
public static void printClassInfo(Object object){
  Class c=object.getClass();
  System.out.println("類的名稱:"+c.getName());
  /**
   * 一個成員方法就是一個method對象
   * getMethod()所有的 public方法,包括父類繼承的 public
   * getDeclaredMethods()獲取該類所有的方法,包括private ,但不包括繼承的方法。
   */
  Method[] methods=c.getMethods();//獲取方法
  //獲取所以的方法,包括private ,c.getDeclaredMethods();
  for(int i=0;i<methods.length;i++){ parametertypes="methods[i].getParameterTypes();" pre="" returntype="methods[i].getReturnType();"></methods.length;i++){>
?
1
2
3
4
5
6
public class ReflectTest {
  public static void main(String[] args){
    String s="ss";
    ClassUtil.printClassInfo(s);
  }
}

運行:

?
1
2
3
4
5
類的名稱:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()

四、獲取成員變量的信息

也可以獲取類的成員變量信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public static void printFiledInfo(Object o){
  Class c=o.getClass();
  /**
  * getFileds()獲取public
  * getDeclaredFields()獲取所有
  */
  Field[] fileds=c.getDeclaredFields();
  for(Field f:fileds){
   //獲取成員變量的類型
   Class filedType=f.getType();
   System.out.println(filedType.getName()+" "+f.getName());
  }
 }
?
1
2
3
4
5
public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    ClassUtil.printFiledInfo(s);
  }

運行:

?
1
2
3
4
5
6
7
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
int HASHING_SEED
int hash32

五、獲取構造函數的信息

?
1
2
3
4
5
6
7
8
9
10
11
12
public static void printConstructInfo(Object o){
  Class c=o.getClass();
  Constructor[] constructors=c.getDeclaredConstructors();
  for (Constructor con:constructors){
   System.out.print(con.getName()+"(");
   Class[] typeParas=con.getParameterTypes();
   for (Class class1:typeParas){
    System.out.print(class1.getName()+" ,");
   }
   System.out.println(")");
  }
 }
?
1
2
3
4
5
6
public static void main(String[] args){
    String s="ss";
    //ClassUtil.printClassInfo(s);
    //ClassUtil.printFiledInfo(s);
    ClassUtil.printConstructInfo(s);
  }

運行:

?
1
2
3
4
5
6
7
8
9
10
java.lang.String([B ,)
java.lang.String([B ,int ,int ,)
java.lang.String([B ,java.nio.charset.Charset ,)
java.lang.String([B ,java.lang.String ,)
java.lang.String([B ,int ,int ,java.nio.charset.Charset ,)
java.lang.String(int ,int ,[C ,)
java.lang.String([C ,boolean ,)
java.lang.String(java.lang.StringBuilder ,)
java.lang.String(java.lang.StringBuffer ,)

六、方法反射的操作

獲取一個方法:需要獲取方法的名稱和方法的參數才能決定一個方法。

方法的反射操作:

?
1
method.invoke(對象,參數列表);

舉個例子:

?
1
2
3
4
5
6
7
8
class A{
 public void add(int a,int b){
  System.out.print(a+b);
 }
 public void toUpper(String a){
  System.out.print(a.toUpperCase());
 }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
  A a=new A();
  Class c=a.getClass();
  try {
   Method method=c.getMethod("add",new Class[]{int.class,int.class});
   //也可以 Method method=c.getMethod("add",int.class,int.class);
   //方法的反射操作
   method.invoke(a,10,10);
  }catch (Exception e){
   e.printStackTrace();
  }
 }

運行:

?
1
 

本篇文章已經講解了java反射的基本用法, 它可以在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。

以上就是本文關于Java反射機制的全部內容,希望對大家有所幫助。

原文鏈接:https://www.2cto.com/kf/201612/578119.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天操天天干天天舔 | 高黄h文各种play | 免费国产在线观看 | 亚洲 欧美 日韩 国产 视频 | 国产精品一区二区久久 | 美女和男人差差 | 午夜免费啪视频观看视频 | 疯狂刺激的3p国产在线 | 古代双性美人被老糟蹋 | 四虎精品影视 | gogort人体的最新网站 | 四虎影院网址大全 | 狠狠插综合网 | 国产精品露脸国语对白99 | 成人免费公开视频 | 免费岛国 | 欧美久久影院 | 精品国产福利在线 | 日本剧情片在线播放中文版 | 国产品精人成福利视频 | 盲井在线 | 好男人影视社区www在线观看 | 日本黄色网页 | 精品一区二区三区免费毛片 | 日韩视频在线精品视频免费观看 | 日韩夫妻性生活 | 暴露狂婷婷 | 嗯啊在线观看免费影院 | 欧美午夜精品 | 96免费精品视频在线 | 全黄h全肉细节文在线观看 全彩成人18h漫画 | 范冰冰性xxxxhd | 成在线人免费 | 国产成人在线影院 | 男同互操| 免费视频精品一区二区三区 | 美女张开腿让我了一夜 | 红杏网| 免费91麻豆精品国产自产在线观看 | 人禽l交视频在线播放 视频 | 国产成人www |