栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

每日答疑汇总>>>Java中级工程师

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

每日答疑汇总>>>Java中级工程师

目录

问题1:什么是注解(Annotation)?为什么在开发时候用注解? 细聊注解?

问题2:什么是反射? 做什么用的呢?

问题3:什么是泛型? 做什么用的呢?


问题1:什么是注解(Annotation)?为什么在开发时候用注解? 细聊注解?

注解@也叫元数据,常见的@重写Override和@Deprecated,注解它是JDK1.5版本开始引入的一个特性(性质),用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

《刨根问底栏目组》:    

  之所以用注解是因为JDK1.5之前的版本中, Spring 中要声明一个 Bean,要通过 XML 配置的方式,现在有了注解,等于减少了一个XML配置文件,减少了开发代码量。 可以直接在类上+注解完成 Bean 的声明工作。

包下面会自动生成一些数据,比如+@controller,importorg.springframework.stereotype.Controller >>意思是使用@controller生成源代码,底层对它会层层调用,从而对使用注解的地方进行一些说明。

package cn.tedu.mapper;

import cn.tedu.pojo.User;
import org.springframework.stereotype.Controller;

import java.util.List;
@Controller

问题2:什么是反射? 做什么用的呢?

官方解释:程序在运行状态中,对于任意一个类,都可以知道这个类所有属性和方法,对于任意一个对象都能够调用他的任意方法和属性。比如你用private关键词封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。

note: 字节码是一堆二进制的文件

先说应用方式以具体案例:

首先要想用反射是需要用到API

三种获取字节码的方式

1.Class.forName(“类的全路径”);




2.类名.class




3.对象.getClass();

下面准备一个测试物料类,里面封装属性进行get set 方法,整些构造 整些普通方法

package cn.tedu.review;

public class Student {
    //1.定义成员变量
    private String name;
    public int age;

    //2.给被封装属性提供get与set方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    //3.生成本类的无参构造与全参构造
    public Student(){}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //4.提供本类的普通方法
    public void play(){
        System.out.println("今天大结局,放学后我要写1W行代码玩玩~");
    }
    public void sunDay(int n){
        System.out.println("国庆一共放"+n+"天");
    }
    //5.为了查看学生对象的具体属性与属性值,重写toString()
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + ''' +
                ", age=" + age +
                '}';
    }
}

利用反射技术获取类对象,重点看步骤

package cn.tedu.reflection;

import org.junit.Test;

import java.lang.reflect.Method;
import java.util.Arrays;


public class TestReflect {
    //1.创建程序的入口函数main()--不用
    
    //2.通过单元测试方法,获取目标类Student对应的字节码对象
    @Test
    public void getClazz() throws ClassNotFoundException {

        //练习获取字节码对象的3种方式
       1. Class clazz1(这里是定义的对象名) = Class.forName("cn.tedu.review.Student");

       2.Class clazz2 = Student.class;

       3. Class clazz3 = new Student().getClass();

        //打印的是Student类对应的字节码对象
        System.out.println(clazz1);//class cn.tedu.reflection.Student
        //获取当前字节码对象clazz1的名字
        System.out.println(clazz1.getName());//cn.tedu.reflection.Student
        //通过字节码对象,获取Student类的类名
        System.out.println(clazz2.getSimpleName());
        //通过字节码对象,获取Student类对应的包对象
        System.out.println(clazz3.getPackage());
        //通过字节码对象,先获取Student类对应的包对象,再获取这个包对象的名字
        System.out.println(clazz3.getPackage().getName());
    }

常听名词>>>反射技术

《刨根问底栏目组》:     

 总结就是这个类不是你创建的,是你同事或者直接是第三方公司,此时你要或得这个类的底层功能调用,就需要反射技术实现

问题3:什么是泛型? 做什么用的呢?

泛型的使用符号是 < >通常用来和集合对象一起使用,它是程序的增强器(下面解释为啥增强了?)它也是目前主流的开发方式。如同上面的注解@

泛型<>什么时候用?

知识点1:当操作的引用的数据类型不确定的时候,就用<>,将要操作的引用数据类型传入即可。

其实<>就是一个接收具体引用数据类型的参数范围

知识点2:在程序中,只要用到带有<>的类或者,就要明确传入的具体引用数据类型。

泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全,运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。

知识点3:为什么擦除泛型?
因为为了去兼容运行的类加载器

《刨根问底栏目组》:    

 泛型可以把报错的时机提前,用于在编译期检查集合的数据类型,只要不是规定的类型,就报错,通不过编译,泛型它只在编译时生效,编译通过以后,说明符合语法,泛型就会被抛弃,字节码文件中没有泛型,并且泛型的类型必须使用引用类型,比如Student、Integer。

                

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号