loading

Java_10 注解与反射

title:(在线学习平台) link:(https://www.acwing.com/) cover:(https://cdn.acwing.com/media/activity/surface/log.png)

tip:[start]

  1. 重载和重写区别

    重载:同一个类中,相同方法名,形参列表不同的方法叫做重载。
    重写:子类继承父类只之后,对父类中同名同参数的方法进行覆盖的操作叫做重写。

  2. 两者的作用:

    重载:可以使同一个类中,同一方法的参数列表中有不同的参数个数和参数类型。
    重写:重写后,当创建子类对象后,通过子类的对象调用父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。(比如多态性9)

  3. 多态性

    重载不表现为多态性。
    重写表现为多态性。

tip:[end]

1 注解

(1) 注解(Annotation)也被称为元数据(Metadata),用于修饰包、方法、属性、构造器、局部变量等数据信息。
(2) 注解不影响程序逻辑,但注解可以被编译或运行。
(3) 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

1.1 常用注解

(1) @Override: 限定某个函数必须重写其他函数,该注解只能用于函数。函数名和参数列表必须相同。
(2) @Overload: 限定某个函数必须重载其他函数,该注解只能用于函数。函数名必须相同,参数列表必须不同。
(3) @Deprecated:用于表示某个程序元素(类、函数)已过时
(4) @SuppressWarnings:抑制编译器警告

  1. @Override: 限定某个函数必须重写其他函数
  • 提示程序员,此函数是重写了父类的函数

image
image
image

  1. @Deprecated:用于表示某个程序元素(类、函数)已过时

image

  1. @SuppressWarnings:抑制编译器警告
    image
    image

    image

1.2 元注解

修饰其他注解的注解,就被称为元注解。

(1) Retention:指定注解的作用范围
(2) Target:指定注解可以用在哪些地方
(3) Document:注定注解是否出出现在javadoc中
(4) Inherited:子类会继承父类的注解

image


2 反射

反射:动态引入类、动态调用实例的成员函数、成员变量等。
改变之后,不需要重新打包整个项目,可以动态加载这个新类(即可以修改)

2.1 常用API

(1) java.lang.Class
(2) java.lang.reflect.Method 动态获取方法
(3) java.lang.reflect.Field 动态修改变量名称
(4) java.lang.reflect.Constructor 获取类的构造方法

  • 把类加载进来,该抛异常抛异常
    image
    image
    image
package org.yxc;

public class Calculator {
    public String name;

    public Calculator() {}

    public Calculator(String name) {
        this.name = name;
    }

    public int add(int a, int b) {
        return a + b;
    }
}

package org.yxc;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
		//Class一个普通的类,这么用就好了
        Class<?> cls = Class.forName("org.yxc.Calculator");
        Object o = cls.newInstance();//生成实例

		//通过反射的API调用函数 int.class, int.class代表add函数两个参数类型
        Method method = cls.getMethod("add", int.class, int.class);
        int res = (int)method.invoke(o, 3, 4);
        System.out.println(res);

		//将实例的name变量,改为My Calculator!
        Field field = cls.getField("name");
        field.set(o, "My Calculator!");
        System.out.println(field.get(o));

        Constructor<?> constructor = cls.getConstructor(String.class);
        Object new_o = constructor.newInstance("New Calculator!");
        System.out.println(new_o);
    }
}

2.2 优缺点

优点:可以动态创建和使用对象,使用灵活
缺点:执行速度慢

posted @ 2024-02-22 12:30  JiajiaMing  阅读(4)  评论(0编辑  收藏  举报