泛型注解与反射

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;
        
    }

}
原文地址:https://www.cnblogs.com/sunxiaoyan/p/9199497.html