我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何在Java项目中使用注解和反射

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何在Java项目中使用注解和反射

今天就跟大家聊聊有关如何在Java项目中使用注解和反射,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

一、注解

注解(Annotation): 从jdk5.0开始引进,可以对程序进行解释或被其他程序读取。

注解格式:"@注释名",并可以添加一些参数。

例:@MyAnnotation(value=‘value')

1、内置注解

@override: 用于修饰方法,表示该方法声明是重写或实现一个父类的方法

@Deprecated: 用于修饰方法、属性、类,表示已过时不建议使用的

@SuppressWarnings: 用于抑制编译时的警告信息

2、元注解

作用:用于注解其他注解

@Target: 用于描述注解的适用范围

例:@Target(ElementType.ANNOTATION_TYPE) 适用范围为注解定义

@retention: 表示需要在什么级别保存该注解信息

SOURCE - 源码级别

CLASS - class级别

RUNTIME - 运行级别

SOURCE < CLASS < RUNTIME

例:@Retention(RetentionPolicy.RUNTIME) 此注解运行时有效

@Documented: 表示是否将注解生成在Javadoc中

@Inherited: 表示子类可以继承父类的注解

3、自定义注解

注解定义:@interface+注解名

@Target(ElementType.METHOD)//作用在方法上@Retention(RetentionPolicy.RUNTIME)//运行时有效@interface Myannotation1{ //注解的参数:参数类型 + 参数名(); String Parameter1() ; int Parameter2() default -1; //默认值为-1代表不存在}@Target(ElementType.METHOD)//作用在方法上@Retention(RetentionPolicy.SOURCE )//源码中有效@interface Myannotation2{ String Value() ;//只有一个参数时,参数名用Value}

测试:

 //有默认值的参数可以不填没有默认值的参数必填,并且参数填写没有顺序 @Myannotation1(Parameter1 = "Parameter1 ") //参数定义为Value时,前面的"Value = "可以省略 @Myannotation2("Value") public void test01(){ }

二、反射

反射(Reflection)是java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

优缺点:具有灵活性但是效率较低。

Class c = Class.forName(java.lang.String)

1、Class类

某个类的属性、方法和构造器、某个类实现了哪些接口,JRE都为其保留了一个不变的Class类型的对象,同一个类的所有对象共享同一个Class对象。

Class类具有以下特点:

  • Class本身也是一个类

  • Class对象只能由系统建立对象

  • 一个加载的类在JVM中只会有一个Class实例

  • 一个Class对象对应的是一个加载到JVM中的一个class文件

  • 每个类的实例都会记得自己是由哪个Class实例所生成

  • 通过Class可以完整地得到一个类中的所有被加载结构

  • Class类是Reflection的根源,针对任何想动态加载、运行的类,唯有先获得相应的Class对象

Class类的常用方法:

方法名功能说明
static Class.forName(String name)返回指定类名name的Class对象
Object newInstance()调用缺省构造函数,返回Class对象的一个实例
getName()返回此Class对象所表示的实体(类、接口、数组类或void)的名称
Class getSuperClass()返回当前Class对象的父类Class对象
Class[] getinterfaces()返回当前Class对象的接口
Class Loader getClassLoader()返回该类的类加载器
Constructor[] getConstructors()返回一个包含某些Constructor对象的数组
Method getMethod(String name ,Class T)返回一个Method对象,此对象的形参类型为paramType
Field[] getDeclaredFields返回Field对象的一个数组

2、通过反射获取Class对象:

所有的类都可以通过反射获取其Class对象。

下面通过例子列举获取类的Class对象的三种方式:

//新建Person类class Person{String name;int age;int id; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
//测试public class test02 { public static void main(String[] args) throws ClassNotFoundException { Person person = new Person(); //方式一、通过包名获取Class class1 = Class.forName("com.reflection.Person");System.out.println(class1.hashCode());//方式二、通过对象获取Class class2 = person.getClass();System.out.println(class3.hashCode());//方式三、通过类获取Class class3 = Person.class;System.out.println(class3.hashCode());}}

输出结果:

如何在Java项目中使用注解和反射

结论:三种方式获取的Class对象为同一个。

3、获取类的运行时结构

public class test03 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { Class c1 = Class.forName("com.reflection.Person"); //获得类的名字 String name = c1.getName();//获得包名加类名 String simpleName = c1.getSimpleName();//获得类名 //获得类的属性 Field[] fields = c1.getFields();//获得类的所有公有属性 Field[] declaredFields = c1.getDeclaredFields();//获得类的所有属性 Field field = c1.getField(name);//获得类的指定公有属性 Field declaredField = c1.getDeclaredField(name);//获得类的指定属性(所有类型均可)  //获得类的方法 Method[] method = c1.getMethods();//获得本类及其父类的所有公有方法 Method[] declaredMethods = c1.getDeclaredMethods();//获得本类的所有方法 Method getName = c1.getMethod("getName", null);//获取指定方法(本类及其父类的所有公有方法) Method setName = c1.getDeclaredMethod("setName", String.class);//获取指定方法(本类的所有方法) //获得类的构造器 Constructor[] constructors = c1.getConstructors();//获取所有公有构造器 Constructor[] declaredConstructors = c1.getDeclaredConstructors();//获取所有构造器 Constructor constructor = c1.getConstructor(String.class, int.class);//获取指定公有构造器 Constructor declaredConstructor = c1.getDeclaredConstructor(String.class, int.class);//获取指定构造器 }}

4、通过反射构造对象

public class Test04 { public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {  //获得Class对象  Class c1 = Class.forName("com.reflection.Person");  //通过反射创建对象  Person person = (Person)c1.newInstance();//本质上是调用了无参构造器  Constructor constructor = c1.getDeclaredConstructor(String.class,int.class);//获取有参构造器  Person person2 = (Person) constructor.newInstance("name",18);//调用有参构造器创建对象  //通过反射调用普通方法  Method setName = c1.getDeclaredMethod("setName", String.class);//获取方法  setName.invoke(person,"name");//通过invoke调用方法  //通过反射操作属性  Field name = c1.getDeclaredField("name");//获取name属性  name.setAccessible(true);//关闭安全检测,关闭后可以访问私有属性(true为关闭,false为打开,默认是false)  name.set(person,"lalala");//设置属性的值 }}

5、通过反射获取注解的信息

创建类和注解

@Testclass("db_Student2")//类注解//创建学生类class Student2{ @Testfield(columnname = "name",type = "varchar",length = 20)//属性注解 String name; @Testfield(columnname = "age",type = "int",length = 3) int age; @Testfield(columnname = "ID",type = "int",length = 10) int ID; public Student2() { } public Student2(String name, int age, int ID) {  this.name = name;  this.age = age;  this.ID = ID; } public String getName() {  return name; } public void setName(String name) {  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; }}//类的注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@interface Testclass{ String value();}//属性的注解@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@interface Testfield{ String columnname(); String type(); int length();}

测试

public class test05 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {  Class c1 = Class.forName("com.zjrcu.reflection.Student2");  //通过反射获得注解  Annotation[] annotations = c1.getAnnotations();  for (Annotation annotation : annotations) {   System.out.println(annotation);  }    //通过反射获得注解value的值  Testclass testclass = (Testclass)c1.getAnnotation(Testclass.class);  String value = testclass.value();  System.out.println(value);    //获取类中指定注解的value值  Field f = c1.getDeclaredField("name");  Testfield testfield = (Testfield) f.getAnnotation(Testfield.class);  System.out.println(testfield.columnname());  System.out.println(testfield.length());  System.out.println(testfield.type()); }}

看完上述内容,你们对如何在Java项目中使用注解和反射有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何在Java项目中使用注解和反射

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何在Java项目中使用注解和反射

今天就跟大家聊聊有关如何在Java项目中使用注解和反射,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开
2023-06-06

Java中的注解和反射怎么使用

这篇文章主要讲解了“Java中的注解和反射怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的注解和反射怎么使用”吧!1、注解(Annotation)1.1 什么是注解(Ann
2023-07-02

java注解和反射怎么使用

Java注解和反射是Java编程中非常重要的概念。注解是一种元数据,可以用来为Java程序提供额外的信息,而反射则允许程序在运行时动态地获取类的信息并操作类的属性和方法。使用Java注解:1. 定义注解:使用 @interface 关键字定
2023-05-29

如何使用Java注解和反射实现Junit4中的用例调用

这篇文章主要讲解了“如何使用Java注解和反射实现Junit4中的用例调用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Java注解和反射实现Junit4中的用例调用”吧!实例需求需
2023-06-15

Java项目中的注解怎么利用反射机制读取

这篇文章将为大家详细讲解有关Java项目中的注解怎么利用反射机制读取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、自定义注解元注解: @interface注解: 定义注解接口@Targe
2023-05-31

如何在 Java 中使用反射机制?(java中的反射机制怎么使用)

在Java编程中,反射机制是一个强大的工具,它允许程序在运行时检查和操作类、对象、方法和字段。通过反射,我们可以在运行时动态地获取类的信息,创建对象,调用方法,以及访问和修改字段。这使得我们的程序更加灵活和可扩展。一、反射的基本概念
如何在 Java 中使用反射机制?(java中的反射机制怎么使用)
Java2024-12-20

在 Java 项目中如何高效地运用 spring 注解?(如何在java项目中有效利用spring注解)

一、前言在Java开发中,Spring框架是一个非常流行的框架,它提供了许多注解来简化开发过程。这些注解可以帮助开发人员更方便地管理依赖注入、事务管理、AOP等方面的工作。本文将介绍如何在Java项目中有效地利用Spring注解
在 Java 项目中如何高效地运用 spring 注解?(如何在java项目中有效利用spring注解)
Java2024-12-19

如何在java中使用反射调用方法

这篇文章将为大家详细讲解有关如何在java中使用反射调用方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的
2023-06-14

如何在 C# 中使用 反射

C# 中的 反射 常用于在程序的运行时获取 类型 的元数据,可获取的信息包括已加载到进程中的 程序集 和 类型 信息,它和 C++ 中的 RTTI(Runtime Type Information) 的作用是差不多的。
C#反射数据2024-12-03

如何在项目中权衡 C# 和 Java 的使用?(如何在项目中权衡c#和java的使用)

在现代软件开发领域,C#和Java是两种非常流行的编程语言,它们各自具有独特的优势和适用场景。对于开发者来说,了解如何在项目中权衡使用C#和Java是一项重要的技能。本文将详细介绍在不同情况下如何做出明智的选择。一、语言特性对比
如何在项目中权衡 C# 和 Java 的使用?(如何在项目中权衡c#和java的使用)
Java2024-12-22

在Java项目中怎么使用@Annotation注解

本篇文章给大家分享的是有关在Java项目中怎么使用@Annotation注解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java注解是在JDK5时引入的新特性,鉴于目前大部分
2023-05-31

如何在Java中利用反射机制查找指定的注解

如何在Java中利用反射机制查找指定的注解?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义注解Controller.java@Target({ElementType.TYPE
2023-05-31

如何在Java中应用反射技术

如何在Java中应用反射技术?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、反射概念Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象
2023-06-15

File如何在Java项目中使用

File如何在Java项目中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java中File的实例详解File代表文件或者目录的类构造函数File(File
2023-05-31

ArrayList如何在Java项目中使用

本篇文章为大家展示了ArrayList如何在Java项目中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ArrayList的类图结构ArrayList继承于 AbstractList,实现了 L
2023-06-14

Arrays.asList()如何在Java项目中使用

本篇文章给大家分享的是有关Arrays.asList()如何在Java项目中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Arrays.asList() 是将数组作为列表。
2023-05-31

ConcurrentHashMap如何在java项目中使用

ConcurrentHashMap如何在java项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。java 使用ConcurrentHashMap在某些场景下,我们想让线
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录