当前位置: 首页 > wzjs >正文

专业轻电商网站建设公司最贵网站建设报价

专业轻电商网站建设公司,最贵网站建设报价,专业的网上购物平台,免费网站建设php反射与注解 教学目标: 理解反射机制的核心原理与应用场景 掌握注解的定义与使用方法 能够通过反射动态操作类、方法和字段 结合反射与注解实现灵活的程序设计 一、课程引入 1.1 为什么需要反射与注解? 反射: 运行时动态获取类信息&…

反射与注解

教学目标

  1. 理解反射机制的核心原理与应用场景

  2. 掌握注解的定义与使用方法

  3. 能够通过反射动态操作类、方法和字段

  4. 结合反射与注解实现灵活的程序设计


一、课程引入

1.1 为什么需要反射与注解?

  • 反射

    • 运行时动态获取类信息(如框架中自动装配对象)

    • 突破封装访问私有成员(慎用!)

  • 注解

    • 为代码添加元数据(如@Override标记重写方法)

    • 替代XML配置,简化开发(如Spring的@Autowired

1.2 生活类比

  • 反射:像“X光透视”,查看程序内部结构

  • 注解:像“标签”,为代码添加说明或指令


二、反射机制

2.1 反射核心API

类/接口作用
Class表示类或接口
Field表示类的成员变量
Method表示类的方法
Constructor表示类的构造方法

2.2 获取Class对象的三种方式

// 方式1:类名.class  
Class<String> clazz1 = String.class;  // 方式2:对象.getClass()  
String str = "Java";  
Class<?> clazz2 = str.getClass();  // 方式3:Class.forName()  
Class<?> clazz3 = Class.forName("java.lang.String");
案例1:动态加载类并创建对象

Class<?> clazz = Class.forName("com.example.User");  
Object user = clazz.newInstance();  // 调用无参构造  
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);  
Object user2 = constructor.newInstance("张三", 25); 

2.3 操作私有成员

案例2:访问私有方法

public class Secret {  private void hiddenMethod() {  System.out.println("秘密方法被调用!");  }  
}  // 反射调用  
Secret obj = new Secret();  
Method method = Secret.class.getDeclaredMethod("hiddenMethod");  
method.setAccessible(true);  // 突破私有限制  
method.invoke(obj); 

三、注解

3.1 内置注解

  • @Override:标记方法重写

  • @Deprecated:标记已过时的方法

  • @SuppressWarnings:抑制编译器警告

3.2 元注解(注解的注解)

元注解作用
@Target定义注解可应用的目标(如方法、字段)
@Retention定义注解保留策略(SOURCE/CLASS/RUNTIME)
@Documented注解包含在Javadoc中

3.3 自定义注解

案例3:定义字段校验注解

@Target(ElementType.FIELD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface NotNull {  String message() default "字段不能为空";  
}  // 应用注解  
public class User {  @NotNull(message = "姓名不能为空")  private String name;  
}

3.4 注解处理器(反射解析注解)

案例4:实现注解校验逻辑

public static void validate(Object obj) throws IllegalAccessException {  for (Field field : obj.getClass().getDeclaredFields()) {  if (field.isAnnotationPresent(NotNull.class)) {  field.setAccessible(true);  Object value = field.get(obj);  if (value == null) {  NotNull anno = field.getAnnotation(NotNull.class);  throw new IllegalArgumentException(anno.message());  }  }  }  
}  // 测试  
User user = new User();  
validate(user);  // 抛出异常:姓名不能为空

四、综合案例

4.1 案例5:简易ORM框架

// 定义表名注解  
@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface Table {  String name();  
}  // 定义字段注解  
@Target(ElementType.FIELD)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface Column {  String name();  String type();  
}  // 应用注解  
@Table(name = "users")  
public class User {  @Column(name = "user_id", type = "INT")  private int id;  @Column(name = "user_name", type = "VARCHAR(50)")  private String name;  
}  // 生成SQL建表语句  
public static String generateCreateTable(Class<?> clazz) {  if (!clazz.isAnnotationPresent(Table.class)) return null;  Table table = clazz.getAnnotation(Table.class);  StringBuilder sql = new StringBuilder("CREATE TABLE " + table.name() + " (\n");  for (Field field : clazz.getDeclaredFields()) {  if (field.isAnnotationPresent(Column.class)) {  Column column = field.getAnnotation(Column.class);  sql.append("  ").append(column.name()).append(" ").append(column.type()).append(",\n");  }  }  sql.deleteCharAt(sql.length() - 2);  // 删除末尾逗号  sql.append(");");  return sql.toString();  
}  // 输出结果:  
// CREATE TABLE users (  
//   user_id INT,  
//   user_name VARCHAR(50)  
// );

五、常见错误与最佳实践

5.1 常见错误

  • 错误1:忽略注解的保留策略

    @Retention(RetentionPolicy.SOURCE)  
    public @interface MyAnnotation {}  
    // 运行时无法通过反射获取该注解
  • 错误2:反射修改final字段

    Field field = String.class.getDeclaredField("value");  
    field.setAccessible(true);  
    field.set("Hello", new char[] {'H','i'});  // 抛出IllegalAccessException

5.2 最佳实践

  • 反射

    • 优先使用公共API,避免操作私有成员

    • 缓存反射结果(如Method对象)提升性能

  • 注解

    • 明确@Target@Retention策略

    • 结合工具(如APT)生成代码


六、总结与练习

6.1 总结

  • 反射:动态操作类结构,但破坏封装性,需谨慎使用

  • 注解:为代码添加元数据,需配合处理器实现功能

6.2 课后任务

  1. 实现一个JSON序列化工具(通过反射将对象转为JSON字符串,支持@JsonIgnore注解忽略字段)

  2. 自定义一个@Test注解,标记测试方法并通过反射自动运行

  3. 预习下一节课:Lambda表达式与Stream API

6.3 扩展挑战

  • 阅读Spring框架源码,分析@Autowired注解的实现原理

http://www.dtcms.com/wzjs/586157.html

相关文章:

  • 做新闻类网站还有市场吗lnmp wordpress php7
  • 免费制作主图的网站铁建设文件在什么网站下载
  • html电影网站模板商务类网站设计
  • 网站建设优秀网c语言新手入门代码
  • 商城型网站的概念品牌网站建设多少钱
  • 晋城网站开发魔兽世界 建设公会网站
  • 哪家公司做网站开发做得比较好特色个人网页设计
  • 深圳国税局网站怎么做票种核定关于网站建设的网站
  • 做网站策划的工具平湖网站建设流程
  • 成都的网站建设开发公司哪家好深圳网站seo地址
  • 重庆企业网站建设哪家好公司网站开发 nodejs
  • 中小企业怎么优化网站20个优秀微信小程序
  • 网站建设图片设置杭州建设信息网
  • 国内著名平面设计师的个人网站我要自学网做网站
  • 网站建设要做哪些前期准备工作设计作品
  • 云南昆州建设工程有限公司网站wordpress注册表文件
  • wordpress acg站网上超市怎么做
  • 网站知识免费傻瓜室内装修设计软件
  • 网站建设与管理是学什么江苏元鼎建设工程有限公司网站
  • 杭州好的公司网站设计用科讯cms做网站的步骤
  • 彩票网站 在哪里做响应式网站页面设计
  • 办公门户网站模板下载重庆网站服务器建设推荐
  • 网站开发发展趋势2018中文域名是什么
  • 如何建设网站教程视屏怎么做转载小说网站
  • 网站空间是怎么开通的傻瓜式网站开发
  • 山东省高中生发展报告在哪个网站做西宁百姓网免费发布信息
  • 吴江住房城乡建设局网站汉字域名注册
  • 专业的网站建设公司做最漂亮的网站
  • 四川移动端网站建设外国人可以在中国做网站吗
  • 两江新区建设管理局网站律师网站建设费用