Java:高级语法

文章目录

参考

Java-反射机制(超详解)

泛型

泛型即参数化类型,也就是说操作的数据类型被指定为一个参数。有泛型类、泛型接口、泛型方法三种使用方式

泛型类:

class 类名称 <泛型标识> {
    
    
  private 泛型标识 /*(成员变量类型)*/ 变量名; 
  .....

  }
}

约定俗称的泛型标识有

  T :代表一般的任何类。
  E :代表 Element 元素的意思,或者 Exception 异常的意思。
  K :代表 Key 的意思。
  V :代表 Value 的意思,通常与 K 一起配合使用。
  S :代表 Subtype 的意思,文章后面部分会讲解示意。

打印不同类型数组元素的泛型方法:


public class GenericMethodTest
{
    
    
   // 泛型方法 printArray    <E>是类型参数声明部分,位于返回类型前                     
   public static < E > void printArray( E[] inputArray )
   {
    
    
      // 输出数组元素            
         for ( E element : inputArray ){
    
            
            System.out.printf( "%s ", element );
         }
         System.out.println();
    }
 
    public static void main( String args[] )
    {
    
    
        // 创建不同类型数组: Integer, Double 和 Character
        Integer[] intArray = {
    
     1, 2, 3, 4, 5 };
        Double[] doubleArray = {
    
     1.1, 2.2, 3.3, 4.4 };
        Character[] charArray = {
    
     'H', 'E', 'L', 'L', 'O' };
 
        System.out.println( "整型数组元素为:" );
        printArray( intArray  ); // 传递一个整型数组
 
        System.out.println( "\n双精度型数组元素为:" );
        printArray( doubleArray ); // 传递一个双精度型数组
 
        System.out.println( "\n字符型数组元素为:" );
        printArray( charArray ); // 传递一个字符型数组
    } 
}

注解

定义:注解是附加在代码中的一些元信息,用来将信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联,供一些工具在编译运行时解析并使用,起到说明、配置的功能。

主要用途:

  • 生成文档。
  • 进行格式检查:如使用 @Override注解放在方法前,若实际并未进行覆盖超类方法,则编译时可检查出来。
  • 跟踪代码依赖性,简化配置过程:如spring使用的基于注解的配置。

分类

  • 标准注解:在这里插入图片描述- 元注解:注解的注解在这里插入图片描述- 自定义注解
    类型定义为@interface,所有的Annotation自动继承java.lang.Annotation这一接口且不能再继承其他类或接口,其成员只能用public或default修饰,要获取类方法和变量的注解信息必须通过反射技术获取Annotation对象,自定义注解需要使用到元注解。

反射

定义:反射允许运行中的Java程序对自身进行检查,正常情况下被private修饰的成员只能在类内部访问,但反射能直接操作类的私有成员(变量、方法、构造器等)
在这里插入图片描述
在这里插入图片描述

类的加载过程:程序经过javac命令后编译出字节码文件(xxx.class),用java命令对字节码文件进行加载和运行,加载到内存中的类就被称为运行时类,是字节码文件class的一个实例。

java.lang.Class类:上文所说的被加载后的xxx.class其实就是Class类的一个对象,也就是说Class类是类的类。

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
反射的动态性

//体会反射的动态性
    @Test
    public void test2(){

        for(int i = 0;i < 100;i++){
            int num = new Random().nextInt(3);//0,1,2
            String classPath = "";
            switch(num){
                case 0:
                    classPath = "java.util.Date";
                    break;
                case 1:
                    classPath = "java.lang.Object";
                    break;
                case 2:
                    classPath = "com.atguigu.java.Person";
                    break;
            }

            try {
                Object obj = getInstance(classPath);
                System.out.println(obj);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /*
    创建一个指定类的对象。
    classPath:指定类的全类名
     */
    public Object getInstance(String classPath) throws Exception {
       // 传入全类名,获取classPath的类对应Class类的实例
       Class clazz =  Class.forName(classPath);
       // 实例化classPath对应的类
       return clazz.newInstance();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43249758/article/details/130395561