zoukankan      html  css  js  c++  java
  • 泛型注解与反射

    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;
            
        }
    
    }
  • 相关阅读:
    【转载】java调用C++写的DLL
    【转载】Java实现word转pdf
    【原创】由一件匪夷所思的事情所想到的
    【原创】不定字段的数据库表设计思路
    【原创】IBM Websphere 报错:JSPG0120E: 为 pageEncoding 属性和匹配 URI 模式的配置元素指定不同的值是非法的。
    weblogic <BEA-000438>
    svn报错 400 Bad Request
    实习技术知识点
    重写HashMap
    QUnit利用代理测试不同PHP开发服务器的json服务
  • 原文地址:https://www.cnblogs.com/sunxiaoyan/p/9199497.html
Copyright © 2011-2022 走看看