Java进阶--注解与反射

Java 进阶day13 单元测试(JUnit)、反射、注解、动态代理 对部分代码进行测试。 阅读详情

注解与反射

注解

注解是JDK5.0引入的新技术。注解不是程序本身,但可以对程序做出解释。且可以被其他程序(如:编译器)读取。
注解的格式是 “@注释名”。还可以添加一些数值,如抑制警告,@SuppressWarnings(value=“unchecked”) 。
注解可分为:内置注解,元注解,自定义注解。

  • 内置注解
    • @Override :重写方法
    • @Deprecated :不推荐程序员使用,但是可以使用,或者存在更好的方法
    • @SuppressWarnings(value=“”) :抑制警告
public class testAnnotation extends Object {
    //重写方法
    @Override
    public String toString(){
        return super.toString();
    }
    //不推荐程序员使用,但是可以使用,或者存在更好的方法
    @Deprecated
    public static void test(){
        System.out.println("Deprecated");
    }

    public void test1(){

    }
}
  • 元注解(meta-annotation):负责注解其他注解
    • @Target :用于描述注解的使用范围(被描述的注解可以用在什么地方)
    • @Retention :表示需要在什么级别保存该注释信息,用于描述注解的生命周期。SOURCE《CLASS《RUNTIME
    • @Documented :说明该注解将被包含在javadoc中
    • @Inherited :说明子类可以继承父类中的该注解
@MyMetaAnnotation
public class testMetaAnnotation {
    public void test(){

    }
}

//定义一个注解
@interface MyAnnotation{

}

//定义一个元注解
//Target用于描述注解的使用范围(被描述的注解可以用在什么地方)
@Target(value = {ElementType.METHOD,ElementType.TYPE})
//Retention表示我们的注解在什么地方还有效
@Retention(value = RetentionPolicy.RUNTIME)
//Documented表示是否将我们的注解生成在JAVAdoc中
@Documented
//Inherited说明子类可以继承父类中的该注解
@Inherited
@interface MyMetaAnnotation{

}
  • 自定义注解:使用@interface 注解名,自定义一个注解,自动继承java.lang.annotation.Annotation接口
    在这里插入图片描述

    这里的RetentionPolicy value();方法,实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值的类型就是参数的类型(返回值只能是基本类型,Class,String,enum)。可以通过default来声明参数的默认值,如果只有一个参数成员,一般参数名为value,注解元素必须有值,定义注解元素时,经常用(空字符串,0)作为默认值。

public class tesDefineAnnotation {
    //注解可以显示赋值,如果没有默认值必须赋值
    @MyAnnotation2(name = "yang", age = 20, id = 1234, schools = "家里蹲")
    public void test(){}

    @MyAnnotation3("yang")
    public void test1(){}
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
    //注解的参数:参数类型+参数名();
    //default "" 默认为空
    String name() default "";
    int age() default 0;
    int id() default -1;//如果默认值为-1,代表不存在

    String[] schools() default {"清华"};
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
    //只有一个参数,且为默认名称value时,添加注解时可以省略value=,其他名称不行
    String value();
}

反射

动态语言:在运行时可以改变其结构的语言,如Object-C,C#,JavaScript,PHP,Python等。静态语言:运行时结构不可变的语言,如Java,C,C++。Java作为静态语言,因为反射机制拥有了动态性。

反射机制允许程序在执行期间借助于Reflection API获取任何类的内部信息。
在这里插入图片描述

简单的反射案例

public class testReflection {
    public static void main(String[] args) throws ClassNotFoundException {
        //通过反射获取类的Class对象
        Class c=Class.forName("com.yang.learning.AnnotationAndReflection.User");
        System.out.println(c);

        Class c1=Class.forName("com.yang.learning.AnnotationAndReflection.User");
        Class c2=Class.forName("com.yang.learning.AnnotationAndReflection.User");
        //一个类在内存中只有一个Class对象
        //一个类被加载后,类的整个结构都会被封装在Class对象中
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());
    }

}
//实体类pojo,entity
class User{
    private String name;
    private int id;
    private int age;

    public User(){}

    public User(String name, int id, int age) {
        this.name = name;
        this.id = id;
        this.age = age;
    }

    private void test(){}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", age=" + age +
                '}';
    }
}

反射的功能及优缺点

  • 在运行时
    • 判断任意一个对象所属的类
    • 构造任意一个类的对象
    • 判断任意一个类所具有的成员变量和方法
    • 获取泛型信息
    • 调用任意一个对象的成员变量和方法
    • 处理注解
    • 生成动态代理

优点:可以实现动态创建对象和编译,体现出很大的灵活性
缺点:对性能有影响

通过反射获取Class类的方法

  • 已知具体的类,通过class属性获取。该方法最为安全可靠,程序性能最高。
    • Class c3=Student.class;
  • 已知某个类的实例,调用该实例的getClass()方法获取
    • Class c1=person.getClass();
  • 已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
    • Class c2=Class.forName(“com.yang.learning.AnnotationAndReflection.Student”);
  • 内置基本数据类型可以直接用类名.Type获取
    • Class c4=Integer.TYPE;

具体代码如下:

public class testClassMethod {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person=new Student();
        System.out.println("这个人是:"+person.name);

        //方式一:通过对象获得
        Class c1=person.getClass();
        System.out.println(c1.hashCode());

        //方式二:forname获得
        Class c2=Class.forName("com.yang.learning.AnnotationAndReflection.Student");
        System.out.println(c2.hashCode());

        //方式三:通过类名.class获得
        Class c3=Student.class;
        System.out.println(c3.hashCode());

        //方式四:基本内置类型的包装类都有一个Type属性
        Class c4=Integer.TYPE;
        System.out.println(c4);

        //获得父类类型
        Class c5=c1.getSuperclass();
        System.out.println(c5);
    }
}

class Person{
    public String name;

    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}

class Student extends Person{
    public Student() {
        this.name="学生";
    }
}

class Teacher extends Person{
    public Teacher() {
        this.name="老师";
    }
}

通过反射获取Class对象后,我们能做什么?

通过反射获取类的信息
public class testGetClassInformation {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        Class c1=Class.forName("com.yang.learning.AnnotationAndReflection.User");

        //获得类的名字
        System.out.println(c1.getName());           //获得包名+类名
        System.out.println(c1.getSimpleName());     //获得类名

        //获得类的属性
        System.out.println("=================================");
        Field[] fields = c1.getFields();    //只能找到public属性
//        for(Field field:fields){
//            System.out.println(field);
//        }

        fields = c1.getDeclaredFields();    //可以找到全部属性
        for(Field field:fields){
            System.out.println(field);
        }

        //获得指定属性的值
        Field name = c1.getDeclaredField("name");
        System.out.println(name);

        System.out.println("=================================");
        //获得类的方法
        Method[] methods = c1.getMethods();     //获得本类及其父类的全部public方法
        for (Method method:methods){
            System.out.println("正常的:"+method);
        }

        methods=c1.getDeclaredMethods();    //获得本类的全部方法
        for (Method method:methods){
            System.out.println("getDeclaredMethods:"+method);
        }

        //获得指定方法
        Method getName=c1.getMethod("getName",null);
        Method setName=c1.getMethod("setName",String.class);

        System.out.println(getName);
        System.out.println(setName);

        System.out.println("=================================");
        //获得指定的构造器
        Constructor[] constructors = c1.getConstructors();
        for(Constructor constructor:constructors){
            System.out.println(constructor);
        }

        constructors=c1.getDeclaredConstructors();
        for(Constructor constructor:constructors){
            System.out.println("##"+constructor);
        }

        //获得指定构造器
        Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        System.out.println(declaredConstructor);
    }
}
通过反射创建类的对象
  • 调用Class对象的newInstance()方法创建类的对象
    • 类必须有一个无参构造器
      • 如果没有无参构造器需要先获取有参构造器,再将参数传入,进行实例化
    • 类的构造器的访问权限需要足够
  • 调用Class类的方法
    • 通过反射,利用Method类的getMethod方法获取类的方法
    • 然后,使用Object类的invoke方法进行调用,并传参
      • Object对应的是原方法的返回值,如果没有返回值,返回null
      • 若原方法是静态方法,形参Object可为null
      • 若原方法形参为空,则Object[] args为null
      • 若原方法为私有方法,则需要再调用invoke前使用setAccessible(true),关闭安全检测
        • setAccessible:作用是启动和禁用安全检测;提高反射的效率,使原本无法访问的私有成员变得可以访问
**public class testReflectionCreateObject {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得class对象
        Class c1=Class.forName("com.yang.learning.AnnotationAndReflection.User");

        //构造一个对象
//        User user=(User) c1.newInstance();      //本质上是调用类的无参构造
//        System.out.println(user);

        //通过构造器创建对象
//        Constructor constructor = c1.getConstructor(String.class, int.class, int.class);
//        User user2 = (User) constructor.newInstance("yang", 123, 18);
//        System.out.println(user2.toString());

        //通过反射调用普通方法
        User user3 =(User) c1.newInstance();
        //通过反射操作方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        //invoke激活
        //(对象,”方法的值“)
        setName.invoke(user3,"yang");
        System.out.println(user3.getName());

        //通过反射操作属性
        System.out.println("========================");
        User user4 =(User) c1.newInstance();
        Field name= c1.getDeclaredField("name");
        //不能直接操作私有属性,需要关闭程序的安全检测,属性或者方法的setAccessible(true)
        name.setAccessible(true);
        name.set(user4,"yang1");
        System.out.println(user4.getName());

    }
}**
通过反射操作泛型

Java使用的是泛型擦除机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。

Java新增了ParameterizedType,GenericArrayType,TypeVariable,WildcardType几种类型来代表不能被归一到Class类中的类型,但是有何原始类型齐名的类型

  • ParameterizedType:表示一种参数化类型,如,Collection
  • GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
  • TypeVariable:是各种类型变量的公共父接口
  • WildcardType:代表一种通配符类型表达式
public class testGenerics {
    public void test1(Map<String ,User> map, List<User> list){
        System.out.println("test1");
    }

    public Map<String ,User> test2(){
        System.out.println("test2");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = testGenerics.class.getMethod("test1", Map.class, List.class);
        Type[] genericParameterTypes = method.getGenericParameterTypes();   //获取泛型的参数类型
        for(Type genericParameterType:genericParameterTypes){
            System.out.println("#"+genericParameterType);
            if (genericParameterType instanceof ParameterizedType){     //获得的参数类型是否等于结构化的参数类型
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for(Type actualTypeArgument:actualTypeArguments){
                    System.out.println(actualTypeArgument);
                }
            }
        }

        method = testGenerics.class.getMethod("test2", null);
        Type genericReturnType = method.getGenericReturnType();
        if (genericReturnType instanceof ParameterizedType){     //获得的参数类型是否等于结构化的参数类型
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for(Type actualTypeArgument:actualTypeArguments){
                System.out.println(actualTypeArgument);
            }
        }
    }
}
通过反射获取注解
public class testReflectionOAnnotation {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class c1 = Class.forName("com.yang.learning.AnnotationAndReflection.Student2");

        //通过反射获得类的注解
        Annotation[] annotations = c1.getAnnotations();
        for(Annotation annotation:annotations){
            System.out.println(annotation);
        }

        //获得类的注解的value的值
        Tableyang Tyang = (Tableyang) c1.getAnnotation(Tableyang.class);
        String value=Tyang.value();
        System.out.println(value);

        //获得类指定的注解
        Field f = c1.getDeclaredField("name");
        Fieldyang annotation = f.getAnnotation(Fieldyang.class);
        System.out.println(annotation.columnName());
        System.out.println(annotation.type());
        System.out.println(annotation.length());
    }
}

@Tableyang("db_student")
class Student2{
    @Fieldyang(columnName = "db_age",type = "int",length = 10)
    private int age;
    @Fieldyang(columnName = "db_id",type = "int",length = 10)
    private int id;
    @Fieldyang(columnName = "db_name",type = "String",length = 3)
    private String name;

    public Student2() {
    }

    public Student2(int age, int id, String name) {
        this.age = age;
        this.id = id;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "age=" + age +
                ", id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tableyang{
    String value();
}

//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldyang{
    String columnName();
    String type();
    int length();
}

其他相关文章

JAVA进阶笔记之单元测试,反射,注解(推荐) 学习目标: 1、一周掌握 JAVA入门知识 2、掌握基础入门C#知识 3、手把手教你vbs脚本制作 4、强大的 IDEA编程利器 5、经典常见的 面试题目技巧 6、家居生活风水一点通 JAVA基础加强笔记(推荐)学习目标:前言主要内容Junit单元测试反射:框架设计的灵魂注解详解总结 前言 希望:2021年,牛年更牛! 主要内容 1. 单元测试 2. 反射详解 3. 注解详解 Junit单元测试 * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。 .. 阅读详情

相关推荐

Linux下安装FastDFS及生成缩略图

1. 安装编译环境 yum install git gcc gcc-c++ make automake vim wget libevent -y 2. 安装libfastcommon基础库 mkdir /root/fastdfs cd /root/fastdfs git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh ins

weixin_45234710的博客 1374

关于实体类entity和返回前端的json数据字段对应问题

1.当你实体类中的字段为mname,返回前端json数据中的字段为menu_name 此时应该如何是好? 原来写过,网上我也查阅了相关资料@JSONField注解、顺便补充一下另外一个注解@Column @JSONField:用来标识实体类中属性与返回前端JSON数据中字段的对应关系 @Column:用来标识实体类中属性与数据表中字段的对应关系 但是呢,问题来了 据说在实体类的字段上面...

AinUser的博客 4044

告别QXDM:在Android Studio中调试与验证高通NV读写功能的完整流程

本文详细介绍了在Android Studio中调试与验证高通NV分区读写功能的完整流程,替代传统的QXDM工具。通过JNI接口层、HAL服务层和Diag通信层的架构设计,开发者可以在熟悉的IDE环境中高效完成NV操作,包括环境配置、错误处理和性能优化等关键实践。

weixin_27013291的博客 261

解决VO类属性与要返回的json串字段名称不一样的问题

结论:解决VO类属性与要返回的json串字段名称不一样的问题,需要用到@JsonProperty(“xxx”)这个注解 那具体怎么使用呢?下面我拿我个人的例子来说明。 需要返回的json串字段格式如下: { "code": 0, "msg": "成功", "data": [ { "name": "热榜", "type": 1, "foods": [ {

水巷石子的博客 6145

Apache Doris集群IP变更急救指南:用Docker容器+priority_networks快速恢复FE/BE节点

本文详细介绍了Apache Doris集群在IP变更情况下的应急处理方案,通过Docker容器和priority_networks配置快速恢复FE/BE节点。文章提供了从容器化环境构建、元数据迁移到生产环境切换的全流程指南,帮助运维团队在30分钟内完成集群恢复,显著减少停机时间。

pink7的博客 114

阿里平头哥与华为芯片的比较

阿里平头哥与华为芯片代表了中国AI芯片领域的两种典型发展路径:平头哥通过兼容CUDA生态快速切入市场,以较低成本提供接近国际水平的AI算力;华为则坚持全栈自研路线,构建从芯片到框架的完整技术体系,更注重供应链安全和自主可控。从短期来看,平头哥PPU在单卡性能参数上全面超越昇腾910B,接近英伟达H20水平,且成本优势明显,有望在云服务和互联网应用领域取得更大市场份额。而华为昇腾则凭借全栈自研和端边云协同优势,在政企市场和科研领域更具竞争力。

shao.bing的专栏 3998

返回前端页面的名称和属性名称不一致问题

场景:比如前端要求你返回一个json数据类型,但是这个json类型的里面属性有的值重复了,比如 { name:zhangsan, age:12, teacher:[ name:Mrs Liu subject:math ]} 12345678 就像这样,出现了两个name,但是前端就是要求这样传的,很蛋疼有没有,都是name,时间长了就不知道啥意思了,所以,咱们有解决一下@JsonProperty(“name”)

weixin_44388890的博客 770

基于MATLAB的PDT DMR物理层仿真

PDT DMR物理层仿真的目标是评估系统的误码率(Bit Error Rate,BER),以及验证和优化各种调制方案、编码方案和信道模型。下面将介绍如何进行PDT DMR物理层的仿真,并提供相应的MATLAB源代码。通过上述步骤,我们可以进行基于MATLAB的PDT DMR物理层仿真,并评估系统的性能。根据实际需求,我们可以修改仿真参数和添加更复杂的信道模型,以更全面地评估系统性能。最后,我们可以将仿真结果进行可视化和分析。首先,我们需要设置仿真的参数,包括调制方案、编码方案、信道模型和信噪比等。

TechPulseZ的博客 459

获取指定注解下的类Class、实体类自定义数据返回前端

通过包名和注解获取类Class import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; import java.net.JarURLConnection; import java.net.URL; import java.net.URLDecoder; import java.util.Enumeration; import java.util.HashSet; import jav

weixin_51216079的博客 85万+

基于STM32的智能快递柜设计(全部资料)

本文设计了一种基于STM32F407ZGT6的智能快递柜系统,通过模块化硬件设计和软件算法优化,实现了24小时无人值守、温湿度智能调控、远程监控等功能。系统集成OLED显示、GSM通信、舵机控制、超声波检测等模块,存取响应时间≤3秒,识别准确率达99.2%,较传统模式效率提升60%。测试表明系统运行稳定,用户满意度达92%,具有成本低、安全性高、可扩展性强等特点,为智慧物流末端配送提供了创新解决方案。未来可引入AI算法、太阳能供电等功能进一步优化系统性能。

3254968421的博客 587

【Autosar从入门到精通到进阶实战篇】75 0x34/0x36/0x37:请求下载、传输数据、请求退出——刷写流程的“三兄弟”

文章摘要:UDS刷写流程0x34/0x36/0x37关键实现要点 本文通过一个真实ECU变砖案例,揭示了UDS刷写服务(0x34请求下载、0x36传输数据、0x37请求退出)的实现陷阱与最佳实践。核心要点: 安全架构设计: 0x34阶段只协商参数,不立即擦除Flash 采用缓冲区暂存数据,避免频繁写Flash 严格检查地址对齐和内存边界 关键改进措施: 实现数据包序列号校验(防错位) 传输层缓冲区溢出保护 0x37阶段必须包含完整性校验(如CRC32) 一次性批量写入Flash,减少擦写次数 典型错误模式:

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 71

Java进阶——注解和反射

文章目录Java基础——注解和反射1、注解1.1、什么是注解(Annotation)1.2、内置注解1.3、自定义注解和元注解(meta-annotation)2、反射1、反射和反射机制2、CLass类3、哪些类型可以有Class对象4、类加载理解5、类加载器6、通过反射动态的创建对象7、反射操作注解 Java基础——注解和反射 1、注解 1.1、什么是注解(Annotation) 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记, 注解的作

万里顾一程的博客 7445

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

专注于编程、AI、人工智能等多个领域内容研究和分析 723

JAVA注解和反射(进阶教程)

Java注解与反射进阶教程

Code_Beaster的博客 601

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【JAVA】注解 及其 反射进阶

目录注解什么是注解常用的内置注解自定义注解(通过反射读取注解会在下面讲到)反射进阶获取类信息通过反射API动态调用方法提高反射效率反射读取注解反射操作泛型 注解 什么是注解 注解与注释极其相似,但是注解可以被程序读取 常用的内置注解 @Override //重写 @Deprecated //不鼓励程序员使用 @DispressWarning //解除警告 public class test2 { @Override //重写 public String toString() {//重写父类t.

qq_44620773的博客 536

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java学习——day24(反射进阶:注解与动态代理)

/ 定义一个自定义注解@Target(ElementType.METHOD) // 这个注解应用在方法上@Retention(RetentionPolicy.RUNTIME) // 运行时可以反射获取String value() default "日志记录";// 应用自定义注解@Log(value = "执行sayHello方法")");try {// 获取 sayHello 方法的 Class 对象// 判断该方法是否有 Log 注解// 获取注解的值。

blackA_的博客 740

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java进阶six junit单元测试,反射,注解,动态代理

Java进阶课程的第六篇,也是最后一篇,junit单元测试,反射,注解,动态代理相关内容。

weixin_74735725的博客 870

JAVA核心知识进阶————反射和注解

注解(Annotation) 作用:1.可以对程序作出解释。 2.可以被其他程序读取(编译器)。 内置注解 @Override 适用于重写方法,重写注解。 @Deprecated 已过时的,不推荐使用(可以使用),有更好的表示方法,最新版本淘汰。 @SuppressWarnings 警告(方法或变量未使用),加上去则镇压警告。 元注解 (meta–annotation) 作用:负责注解其他注解,Java定义了4个元注解。 @Target @Retention @Documented @Inh

Meyolo_的博客 1132

java进阶day35反射机制、注解

本章重点是ReflectTest7和ReflectTest10 p822 回顾反射机制 什么是反射机制?有什么用? 通过反射机制可以操作字节码文件,可以操作操作字节码创建对象。使程序更加灵活。 反射机制相关的类在哪些包下? java.lang.reflect.* 反射机制相关的主要的类? java.lang.Class java.lang.reflect.Method java.lang.reflect.Constructor java.lang.reflect.Field

不要回答的博客 283

Java进阶 —— 注解与反射

在了解完Java中的集合和IO流之后,荔枝继续梳理有关Java反射的知识,这个基础知识点也是在面试中可能会考到滴哦~~~在这篇文章中,荔枝主要梳理了有关Java反射、动态代理类的实现和注解的相关知识。其中Java反射中通过反射来获取指定方法、属性、父类和接口等内容需要掌握,还有一个重点就是如何实现动态代理类。

荔枝当大佬的博客 371

视频教程-java进阶技术:泛型、反射、注解-Java

java进阶技术:泛型、反射、注解 讲师,多年教学与开发、架构经验,专注于J...

weixin_31131503的博客 311

Java进阶之反射&注解&动态代理

Java进阶之反射&注解&动态代理一、类加载器1.1 类的加载时机1.2 类的加载机制二、反射2.1反射概述2.2 获取Class的三种方式2.3 Class中的常见方法2.4 Class获取构造方法并创建对象2.4.1 获取空参构造方法并使用2.4.2 获取带参数构造方法并使用2.4.3 暴力反射【不推荐】2.4.4 反射创建对象的简便方式2.5 Class获取成员方法并使用2.5.1 获取空参数成员方法并使用2.5.2 获取带参数成员方法并使用2.6 反射的应用案例三、注解3.1 注解概

tysearch的博客 1318

JAVA重点基础、进阶知识及易错点总结(24)反射进阶 + 注解初探

本文摘要:Java反射与注解是框架底层核心机制。反射通过Class对象在运行时获取类信息、操作私有成员(需setAccessible),注解为代码添加元数据(需@Retention(RUNTIME))。两者结合实现动态配置(如Spring IOC)。文章详解反射三步骤、注解定义与读取、泛型擦除解决方案(TypeToken模式),并给出实战任务:实现配置加载器、BeanUtils.copyProperties等。关键点包括暴力反射风险、注解运行时保留、泛型类型保留技巧,强调反射性能优化(缓存对象)与安全注意事

qq_52071206的博客 182

java进阶笔记十二(...args/反射调方法/注解/元注解/Deprecated注解/注解中定义属性)

public static void m(String s, int…(2)属性名是value且只有一个属性时可以省略,直接放属性值。(1)如果注解中有属性,使用时要加(属性名=属性值)(3)属性是数组,如果只有一个值,大括号可省。Target用来标注注解可以出现在哪些位置上。Retention被标记的注解最终保存在哪。修饰符 @interface 名称 {}(4)调用invoke,得到返回值。Override:重写父类方法。用来修饰注解的注解叫元注解。(3)传入方法名,参数。

kekexiaomayi的博客 458

Java SE进阶注解和反射

java进阶知识——注解与反射

m0_63836635的博客 206

JAVA进阶(三)——注解和反射

/常见的注解(重写) public class CommonAnnotationDemo implements Runnable {@Override //重写注解 public void run() {@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞手法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择;@SuppressWarings:定义在java.lang.SuppressWarning中,用来抑制编译时的警告信息;

qq_51446461的博客 941
上一篇: 类的生命周期(类加载,类加载器,双亲委派机制)
下一篇: JVM--Java虚拟机
likehack
博客等级 码龄8年 526粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

likehack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值