激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

香港云服务器
服務器之家 - 編程語言 - Java教程 - Java 反射機制知識詳細介紹及總結

Java 反射機制知識詳細介紹及總結

2020-07-25 15:49java教程網 Java教程

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

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

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

一、什么是class類

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 類的實例;可以通過getame();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
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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++){
      //得到方法的返回類型
      Class returnType=methods[i].getReturnType();
      System.out.print(returnType.getName());
      //得到方法名:
      System.out.print(methods[i].getName()+"(");
 
      Class[] parameterTypes=methods[i].getParameterTypes();
      for(Class class1:parameterTypes){
        System.out.print(class1.getName()+",");
      }
      System.out.println(")");
    }
  }

運行:

?
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
14
15
16
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
13
14
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
9
10
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反射的基本用法, 它可以在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
574
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久久久久久久淑女av国产精品 | 被啪羞羞视频在线观看 | 在线观看日韩av电影 | 国产88久久久国产精品免费二区 | 激情久久一区二区 | 国产91久久精品一区二区 | 久久久久国产视频 | 日韩黄色一级视频 | 91成人免费网站 | 97香蕉超级碰碰久久免费软件 | 成人免费看片a | 羞羞视频免费观看入口 | 久草网在线| av亚洲在线观看 | 亚洲免费永久 | 成人午夜免费国产 | 欧美性生交xxxxx久久久 | 高清在线国产 | 99日韩精品视频 | 国产一区二区三区高清 | 免费国产在线视频 | 免费黄色欧美视频 | 日本爽快片100色毛片视频 | 欧美成人高清视频 | 92看片淫黄大片欧美看国产片 | 九九热在线视频观看 | 欧美爱爱一区二区 | 一级成人欧美一区在线观看 | 中文字幕精品一区久久久久 | 国产亚洲精品视频中文字幕 | 国产手机av在线 | 久色视频网站 | 国产精品成人免费一区久久羞羞 | 中国免费黄色 | 99综合视频 | 精品久久久久久久久久久αⅴ | 日日草视频 | 91小视频在线观看免费版高清 | 欧美激情猛片xxxⅹ大3 | 成人一区久久 | 草碰人人 |