泛型注解與反射


 

 

 

1.泛型不是特定的數據類型

 泛型限定數據類型的位置:類上(全局),方法上(局部)

    使用:參數,方法體內,方法的返回,屬性,構造方法內

     賦值:

2.?通配圖在參數需要根據輸入的泛型確定時使用、

 3?通配符使用分為兩種情況:

(1)方法內直接使用?通配符,此時參數中有通配符的不能直接調用,因為錄入的對象無法確定類型(super定義的子類可以確定)

(2)參數中使用?通配符,目的是在參數錄入上才確定泛型的類型

 extend表示只能是類及其子類,super表示只能是類及其父類

4.通配符的使用在JDK1.8之后才可以使用

//在JDK1.8之后才可以用
         //MyClass<?,?,?> mc = new MyClass<>();

5.代碼演示

package com.inspur.fangxing;

public class MyClass<A,B,C> {
    private A field1;
    private B filed2;
    private C field3;
    public A getField1() {
        return field1;
    }
    public void setField1(A field1) {
        if(field1 instanceof Integer){
            Integer num = (Integer)field1;
            num++;
            this.field1=(A)num;
        }else if(field1 instanceof String){
            int num = Integer.parseInt((String)field1);
            num++;
            Integer temp = num;
            this.field1=(A)temp;
        }else{
            this.field1 = field1;
        }
        
        
    }
    public B getFiled2() {
        return filed2;
    }
    public void setFiled2(B filed2) {
        this.filed2 = filed2;
    }
    public C getField3() {
        return field3;
    }
    public void setField3(C field3) {
        this.field3 = field3;
    }

}
package com.inspur.fangxing;

public class DemoMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //在泛型聲明后,在調用類型時才確定
         MyClass<Integer, Float, String> mc = new MyClass();
         mc.setField1(3);
         mc.setFiled2(12.3f);
         mc.setField3("abc");
         //取數據的時候也確定類型
         System.out.println(mc.getField1());
        //在JDK1.8之后才可以用
         //MyClass<?,?,?> mc = new MyClass<>();

    }

}

 注解:

1. java.lang包是java的基礎系統工具包(默認加載的包)

2.(1)注解是一種特殊的接口,繼承了Annotation接口,但不可以寫實現類。用來標識類或接口中的元素的作用或功能等含義( 不能直接使用注解類,用的是注解標簽)。通過別的類添加注解,並且通過反射讀取注解來完成特定的任務(注解所標識的功能或者需求)。

--------可以用來替代XMl配置描述文件

(2)注解的位置:

  • MyAnnotation.java
  • package com.inspur;
    import java.lang.annotation.*;
    
    public @interface MyAnnotation {
    
    }
  • MyClass.java
  • package com.inspur;
    //
    @MyAnnotation
    public class MyClass {
         //屬性
        @MyAnnotation
         public String name;
         //構造
        @MyAnnotation
         public MyClass(){
             
         }
         //方法
        @MyAnnotation
         public void show(){
             
         }
         //參數
         public void method(@MyAnnotation int num){
             
         }
    
    }

     

3.三種注解可以使用的級別:第一個是源代碼時,第二個是編譯時,第三個是運行時

4.Filed:屬性。

 5.設置注解的級別:例是運行時。默認值是value

 6.

(1)student.java

package com.inspur.demo2;

public class Student {
    public String name="小明";//訪問修飾符,類型和屬性名
    public static int age=20;
    public Student(){ //訪問修飾符,名,並且可以用來創建對象
        
    }
    public Student(String name){
        this.name=name;
    }
    public void clean(){ //訪問修飾符,返回類型,名, 方法體
        System.out.println(this.name+"掃地中");
    }

}

 

(2)DemoMain1.java:主要是獲得屬性。方法和構造在反射中。

package com.inspur.demo2;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;

public class DemoMain1 {

    public static void main(String[] args) {

        try {
            Class c = Student.class;
            // 屬性field
            Field field = c.getField("name");
            System.out.println(field);
            // getModifiers得到name的訪問修飾符,Modifier.toString()轉化為人可以識別的字符串形式
            // 1.可讀 2.可寫 3.可讀寫 4.只讀
            System.out.println(Modifier.toString(field.getModifiers()));
            System.out.println(field.getType()); // 返回類型對象
            System.out.println(field.getType() == String.class);
            // 這里field.get(new Student("王五" ))的構造函數
            String name = (String) field.get(new Student());     ------ get()方法是得到屬性值
            System.out.println(name);

            System.out.println("------------");
            Field fieldAge = c.getField("age");
            System.out.println(fieldAge.getType() == Integer.class);
            System.out.println(fieldAge.getType() == int.class);
            // 如果判斷是不是int類型,則:
            if (fieldAge.getType() == int.class
                    || fieldAge.getType() == Integer.class) {
                System.out.println(fieldAge.getName());
                // 如果age是static類型則獲得屬性值為:
                System.out.println(fieldAge.get(null));

            }

            // 方法method--訪問修飾符,返回類型,名稱,參數,運行方法
            // 構造constructor

        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

 

反射: 注意訪問修飾符

1.反射可以讀取類中的注解,屬性,構造,方法等元素

2.反射:Class類三種獲取方式,且程序中唯一

 3.承接上文

 

// 方法method--訪問修飾符,返回類型,名稱,參數,運行方法
            Method method =c.getMethod("clean", String.class,int.class);
            System.out.println(Modifier.toString(method.getModifiers()));
            System.out.println(method.getReturnType());
            System.out.println(method.getName());
            System.out.println(Arrays.toString(method.getParameterTypes()));
            //invoke()調用方法    
            method.invoke(new Student(), "字符串",20);

 

// 構造constructor--修飾符,名,參數,運行構造對象
            Constructor cons = c.getConstructor(String.class);
            System.out.println(Modifier.toString(cons.getModifiers()));
            System.out.println(cons.getName());
            System.out.println(Arrays.toString(cons.getParameterTypes()));
            Object obj = cons.newInstance("小黑");
            System.out.println(obj);
            Field field = c.getField("name");
            System.out.println(field.get(obj));
            field.set(obj, "小鄧");
            System.out.println(field.get(obj));

 4.反射實例;

(1)Book.java

package com.inspur.demo3;

public class Book {
    private String name;
    private float price;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    @Override
    public String toString(){
        return this.name+","+this.price;
    }

}

 

(2)DemoMain.java

package com.inspur.demo3;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class DemoMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str="name=lisi&sex=men&age=10";
        //String str="name=海明威&price=10.0";
        Map<String,String> map = new HashMap<String,String>();
        String[] first = str.split("&");;
        for(String tempStr:first){
            String [] second = tempStr.split("=",2);
            map.put(second[0], second[1]);
            
        }
        /*User user = new User();
        user.setName(map.get("name"));
        user.setSex(map.get("sex"));
        user.setAge(Integer.parseInt(map.get("age")));
        System.out.println(user);*/
        
        //用反射的方法 
        String className="com.inspur.demo3.User";
        Object obj = ObjectUtil.getObject(className,map);
        System.out.println(obj);
        

    }

}

 

(3)ObjectUtil.java

package com.inspur.demo3;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;

public class ObjectUtil {

    public static Object getObject(String className,Map<String,String> map) {
        try {
            Class c = Class.forName(className);
            Object obj = c.newInstance();
            //遍歷map集合,獲取參數的key和value兩個值
            Set<String> keySet = map.keySet();
            for(String fieldName :keySet){//fieldName即map的key
                String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                String setMethodName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                Method getMethod = c.getMethod(getMethodName, null);
                Method setMethod=c.getMethod(setMethodName, getMethod.getReturnType());
                //這樣寫獲得不到屬性,因為屬性是私有的
                /*Field field=c.getField(fieldName);
                if(field.getType()==int.class||field.getType()==Integer.class){
                     setMethod.invoke(obj, Integer.parseInt(map.get(fieldName)));
                }
                else if(field.getType()==float.class||field.getType()==Float.class){
                    setMethod.invoke(obj, Float.parseFloat(map.get(fieldName)));
                }else{
                    setMethod.invoke(obj, map.get(fieldName));
                }*/
                if(getMethod.getReturnType().getName()=="int"||getMethod.getReturnType().getName()=="Integer"){
                    setMethod.invoke(obj, Integer.parseInt(map.get(fieldName)));
                }else if(getMethod.getReturnType().getName()=="float"||getMethod.getReturnType().getName()=="Float"){
                    setMethod.invoke(obj, Float.parseFloat(map.get(fieldName)));
                }else{
                    setMethod.invoke(obj, map.get(fieldName));
                }
            }
            return obj;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        return null;
        
        
    }

}

 

(4)User.java

package com.inspur.demo3;

public class User {
    private String name;
    private String sex;
    private int age;
    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;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString(){
        return this.name+","+this.sex+","+this.age;
        
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM