国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

服務器之家 - 編程語言 - Java教程 - Java內省實例解析

Java內省實例解析

2021-03-15 13:30李春春_ Java教程

這篇文章主要介紹了Java內省實例解析,具有一定借鑒價值,需要的朋友可以參考下

圖像中輪廓的個數,里面vector的size代表了輪廓上點的個數。了解JavaBean

內省對應的英文單詞為IntroSpector,它主要用于對JavaBean進行操作,JavaBean是一種特殊的Java類,其中的某些方法符合某種命名規則,如果一個Java類中的一些方法符合某種命名規則,則可以把它當作JavaBean來使用。

JavaBean是一種特殊的Java類,主要用于傳遞數據信息,這種java類中的方法主要用于訪問私有的字段,且方法名符合某種命名規則。

如果要在兩個模塊之間傳遞多個信息,可以將這些信息封裝到一個JavaBean中,這種JavaBean的實例對象通常稱之為值對象(ValueObject,簡稱VO)。這些信息在類中用私有字段來存儲,如果讀取或設置這些字段的值,則需要通過一些相應的方法來訪問,大家覺得這些方法的名稱叫什么好呢?JavaBean的屬性是根據其中的setter和getter方法來確定的,而不是根據其中的成員變量。如果方法名為setId,中文意思即為設置id,至于你把它存到哪個變量上,用管嗎?如果方法名為getId,中文意思即為獲取id,至于你從哪個變量上取,用管嗎?去掉set前綴,剩余部分就是屬性名,如果剩余部分的第二個字母是小寫的,則把剩余部分的首字母改成小的。

例如:

setId()的屬性名-->id

isLast()的屬性名-->last

setCPU的屬性名是什么?-->CPU

getUPS的屬性名是什么?-->UPS

總之,一個類被當作javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量。

一個符合JavaBean特點的類可以當作普通類一樣進行使用,但把它當JavaBean用肯定需要帶來一些額外的好處,我們才會去了解和應用JavaBean!好處如下:

在JavaEE開發中,經常要使用到JavaBean。很多環境就要求按JavaBean方式進行操作,別人都這么用和要求這么做,那你就沒什么挑選的余地!

JDK中提供了對JavaBean進行操作的一些API,這套API就稱為內省。如果要你自己去通過getX方法來訪問私有的x,怎么做,有一定難度吧?用內省這套api操作JavaBean比用普通類的方式更方便。

對JavaBean的簡單內省操作

主要用到了java.beans.PropertyDescriptor類,用來得到某個Class對象屬性集中的某個JavaBean屬性,然后調用getReadMethod()、getWriteMethod()方法獲得相應的get、set方法。

代碼示例:

Domain類:

[cpp]viewplaincopy

intmain()

?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package ustc.lichunchun.bean;
import java.util.Date;
public class ReflectPoint {
  private Date birthday = new Date();
private int x;
public int y;
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";
public ReflectPoint(int x, int y) {
    super();
    this.x = x;
    this.y = y;
}
@Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}
@Override
  public Boolean equals(Object obj) {
    if (this == obj)
          return true;
    if (obj == null)
          return false;
    if (getClass() != obj.getClass())
          return false;
    final ReflectPoint other = (ReflectPoint) obj;
    if (x != other.x)
          return false;
    if (y != other.y)
          return false;
    return true;
}
@Override
  public String toString(){
    return str1 + ":" + str2 + ":" + str3;
}
public int getX() {
    return x;
}
public void setX(int x) {
    this.x = x;
}
public int getY() {
    return y;
}
public void setY(int y) {
    this.y = y;
}
public Date getBirthday() {
    return birthday;
}
public void setBirthday(Date birthday) {
    this.birthday = birthday;
}
}

簡單內省操作:

?
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
27
28
29
30
package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntroSpectorTest {
    public static void main(String[] args) throws Exception {
        ReflectPoint pt1 = new ReflectPoint(3, 5);
        String propertyName = "x";
        //"x"-->"X"-->"getX"-->MethodGetX-->
        getProperty(pt1, propertyName);
        Object value = 7;
        setProperty(pt1, propertyName, value);
        System.out.println(pt1.getX());
    }
    private static void setProperty(Object pt1, String propertyName, Object value)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
        Method methodSetX = pd.getWriteMethod();
        methodSetX.invoke(pt1, value);
    }
    private static Object getProperty(Object pt1, String propertyName)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
        Method methodGetX = pd.getReadMethod();
        methodGetX.invoke(pt1);
    }
}

對JavaBean的復雜內省操作

采用遍歷BeanInfo的所有屬性方式來查找和設置某個RefectPoint對象的x屬性。在程序中把一個類當作JavaBean來看,就是調用IntroSpector.getBeanInfo方法,得到的BeanInfo對象封裝了把這個類當作JavaBean看的結果信息。

復雜內省操作:

?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class IntroSpectorTest {
    public static void main(String[] args) throws Exception {
        ReflectPoint pt1 = new ReflectPoint(3, 5);
        String propertyName = "x";
        //"x"-->"X"-->"getX"-->MethodGetX-->
        Object retVal = getProperty(pt1, propertyName);
        System.out.println(retVal);
        Object value = 7;
        setProperty(pt1, propertyName, value);
        System.out.println(pt1.getX());
    }
    private static void setProperty(Object pt1, String propertyName, Object value)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
        Method methodSetX = pd.getWriteMethod();
        methodSetX.invoke(pt1, value);
    }
    private static Object getProperty(Object pt1, String propertyName)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        /*
    PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
    Method methodGetX = pd.getReadMethod();
    methodGetX.invoke(pt1);
    */
        BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        Object retVal = null;
        for (PropertyDescriptor pd : pds){
            if(pd.getName().equals(propertyName)){
                Method methodGetX = pd.getReadMethod();
                retVal = methodGetX.invoke(pt1);
                break;
            }
        }
        return retVal;
    }
}

使用BeanUtils工具包操作JavaBean

在前面內省例子的基礎上,用BeanUtils類先get原來設置好的屬性,再將其set為一個新值。get屬性時返回的結果為字符串,set屬性時可以接受任意類型的對象,通常使用字符串。

用PropertyUtils類先get原來設置好的屬性,再將其set為一個新值。get屬性時返回的結果為該屬性本來的類型,set屬性時只接受該屬性本來的類型。

注意:用這兩個類之前,需要在eclipse工程的lib文件夾中導入commons-beanutils.jar、commons-logging-1.1.jar兩個jar包,并且AddtoBuildPath。

代碼示例:

?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package ustc.lichunchun.bean;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
public class IntroSpectorTest {
    public static void main(String[] args) throws Exception {
        ReflectPoint pt1 = new ReflectPoint(3, 5);
        String propertyName = "x";
        //"x"-->"X"-->"getX"-->MethodGetX-->
        Object retVal = getProperty(pt1, propertyName);
        System.out.println(retVal);
        Object value = 7;
        setProperty(pt1, propertyName, value);
        System.out.println(BeanUtils.getProperty(pt1, "x").getClass().getName());
        //String
        BeanUtils.setProperty(pt1, "x", "9");
        System.out.println(pt1.getX());
        /*
    Map map = {name:"zxx",age:18};//java7的新特性
    BeanUtils.setProperty(map, "name", "lcc");
    */
        BeanUtils.setProperty(pt1, "birthday.time", "111");
        //支持屬性鏈
        System.out.println(BeanUtils.getProperty(pt1, "birthday.time"));
        PropertyUtils.setProperty(pt1, "x", 23);
        System.out.println(PropertyUtils.getProperty(pt1, "x").getClass().getName());
        //Integer
        /*
    BeanUtils和PropertyUtils的區別:
    BeanUtils以字符串形式對JavaBean進行操作,也可以操作Map類,并且可以講JavaBean和Map進行互相轉換(describe、populate)
    PropertyUtils以JavaBean屬性本身的數據類型進行操作  
     */
    }
    private static void setProperty(Object pt1, String propertyName, Object value)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
        Method methodSetX = pd.getWriteMethod();
        methodSetX.invoke(pt1, value);
    }
    private static Object getProperty(Object pt1, String propertyName)
          throws IntrospectionException, IllegalAccessException, InvocationTargetException {
        /*
    PropertyDescriptor pd = new PropertyDescriptor(propertyName, pt1.getClass());
    Method methodGetX = pd.getReadMethod();
    methodGetX.invoke(pt1);
    */
        BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
        Object retVal = null;
        for (PropertyDescriptor pd : pds){
            if(pd.getName().equals(propertyName)){
                Method methodGetX = pd.getReadMethod();
                retVal = methodGetX.invoke(pt1);
                break;
            }
        }
        return retVal;
    }
}

總結

以上就是本文關于Java內省實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/zhongkelee/article/details/52678667

延伸 · 閱讀

精彩推薦
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 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美特级| 免费a视频 | 欧美日韩免费 | 精品日韩 | 亚洲精品偷拍自拍 | 久久天天 | 51ⅴ精品国产91久久久久久 | 日韩中文字幕在线观看 | 一级毛片免费看 | 久久女人网| 天天干,夜夜操 | 黄色一区二区三区 | 国产精品视频专区 | 亚洲激情在线观看 | 中文字幕av亚洲精品一部二部 | 国产综合精品一区二区三区 | 亚洲国产区 | 久久一区二区三区四区 | 成人在线小视频 | 亚洲一区二区三区在线播放 | 日韩成人精品在线 | 久久久久久久久久久久久久免费看 | 国产一区二区在线免费观看 | 国产在线拍 | 日本伊人网 | 国产精品美女久久久久久免费 | 精品成人av一区二区三区 | 欧美成人毛片 | 91在线综合 | 自拍偷拍视频网站 | 国产日韩欧美一区二区 | 欧美精品一区二区三区在线 | 91精品国产综合久久久久久丝袜 | 日本 欧美 国产 | 国产视频综合在线 | 精品久久99 | 麻豆.蜜桃.91.天美入口 | 欧美成人精品激情在线观看 | 欧美日韩在线免费观看 | 日韩精品一级毛片 | 亚洲一二三 |